但 Objective-C 对象仍然或多或少是手动管理的,并且 RAII 习惯用法在该语言中完全不存在。
我认为无论如何这似乎可以回答你的问题。因为 Objective-C 对象是引用计数的,所以它们已经实现了创建智能指针的目的:将对象的生命周期与其所包含的方法的范围分开或捆绑在一起。scoped_ptr
可以使用自动释放池重新创建,并且shared_ptr
s with -retain
--release
or strong
参考。
但说“不”很无聊。如果你真的想像这样混合 Objective-C 和 C++,我们需要首先放宽“Objective-C 对象”的定义。运行时可以识别任何带有isa
作为对象的第一个成员,我们可以利用这一点并编写一个带有相应对象接口的简单 C++ 类,以便可以向其发送消息:
@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 变得更加智能。