问题在主题中。
我想编写一些通用的模板函数来安全地删除对象,并且想知道是否可以使用类似以下方式的内容:
template< class T > void SafeDelete( T*& pVal )
{
if(objc_is_cpp_object(pVal)){
delete pVal;
pVal = NULL;
}
else
[pVal release]
}
问题在主题中。
我想编写一些通用的模板函数来安全地删除对象,并且想知道是否可以使用类似以下方式的内容:
template< class T > void SafeDelete( T*& pVal )
{
if(objc_is_cpp_object(pVal)){
delete pVal;
pVal = NULL;
}
else
[pVal release]
}
如评论中所述,我建议不要混合使用C++的delete
和Objective-C的release
。
从技术角度来看,您可以使用以下SFINAE技巧运行时:
template<typename T> struct void_ { typedef void type; };
template<typename, typename = void>
struct CppType { static const bool value = false; };
template<typename T>
struct CppType<T, typename void_<int (T::*)>::type> { static const bool value = true; };
template< class T >
void SafeDelete( T*& pVal )
{
if(CppType<T>::value || std::is_pod<T>::value) { // <-----
delete pVal;
pVal = 0;
}
else {
// [pVal release];
}
}
is_pod
函数可用,但实现起来也很简单。int (T::*)
表示成员变量的指针。现在,只有对于C++ class
或union
类型才可以使用成员指针,而不能针对其他实体。因此,如果给定的类型是C++ class
类型,则 CppType<T>::value
将为 true
,您可以执行C++特定任务。 - iammilindObjective-C指针与C++指针相同:它们是指向内存中各种对象的4到8个字长的整数值。Objective-C编译器支持以多种格式输出值,如C、C++和Objective-C对象布局。
就这些了,实际上没有太多其他的东西。
你可以尝试做一些奇怪的事情,比如创建一个类,其中一个字段始终包含一个魔术值:
template <class T>
class Magic {
private:
const char magic[] = 1234567;
public:
bool is_object() const {
return magic == 1234567;
}
}
bool is_cpp(void *ptr) {
return ((Magic*) ptr)->is_object();
}
struct objc_object
类型,其(虽然是私有的)定义惯用法必须包含一个isa_t isa
成员...虽然我不知道运行时检查,但我个人发现objc_object::isa
已经足够好用于SFINAE,例如objc::traits::is_object<T>
;请参见:http://git.io/vCsLa - 更多阅读资料:http://unixjunkie.blogspot.de/2006/02/nil-and-nil.html以及objc运行时源代码- http://www.opensource.apple.com/source/objc4/objc4-647/runtime/objc-private.h - fish2000
delete
е’ҢObj-Cдёӯзҡ„release
ж„Ҹд№үе®Ңе…ЁдёҚеҗҢпјӣж··ж·ҶиҝҷдёӨиҖ…дјјд№ҺжҳҜдёҖдёӘеҸҜз–‘зҡ„жғіжі•гҖӮ - David Gelhar