Objective-C可以在一定程度上与C++混合使用,彼此调用。但是Objective-C对象仍然在很大程度上是手动管理的,并且RAII习惯用语完全不存在于该语言中。我想知道是否可能使用c++智能指针来管理Objective-C对象的生命周期。特别是现在C++11标准已经添加了boost scoped_ptr
和shared_ptr
Objective-C可以在一定程度上与C++混合使用,彼此调用。但是Objective-C对象仍然在很大程度上是手动管理的,并且RAII习惯用语完全不存在于该语言中。我想知道是否可能使用c++智能指针来管理Objective-C对象的生命周期。特别是现在C++11标准已经添加了boost scoped_ptr
和shared_ptr
@interface CFIObject : NSObject
- (void)doSomething;
@end
struct CFIObject_cxx {
Class isa;
public:
CFIObject_cxx() : isa([CFIObject class]) {}
~CFIObject_cxx() { printf("I'm dying!"); }
};
@implementation CFIObject
- (void)doSomething {
NSLog("I did something.");
}
@end
我们现在可以实例化一个 C++ 对象并将其包装到智能指针中,我会故意将它分成两个方法来说明对象的生命周期。void func() {
// Instantiate a smart pointer with our fake object.
std::unique_ptr<CFIObject_cxx> cppObj (new CFIObject_cxx());
id obj = (__bridge id)(cppObj.get());
// The runtime thinks we're an object.
[obj doSomething];
// aaaand, it's out of scope.
}
int main(int argc, const char **argv) {
func();
return 0;
}
正如人们所期望的那样,这将打印:
2013-12-22 17:23:22.681 Test[77528:303] I did something
I'm dying!
如果需要,析构函数可配置为调用 -dealloc
以模拟正确的对象销毁,但我希望您看到所有这些都是完全不必要的,特别是随着 CLANG 的每个版本发布,ARC 变得越来越智能。
输出至控制台。