dif*_*ism 8 c++ memory-management raii objective-c
Objective-C可以在某种程度上与c ++混合使用,并且可以相互调用.但Objective-C对象仍然或多或少地手动管理,并且语言中完全没有RAII习语.我想知道是否有可能用c ++智能指针来管理Objective-C对象的生命周期.特别是现在既增强scoped_ptr又shared_ptr已添加到C++ 11标准
Cod*_*aFi 14
但Objective-C对象仍然或多或少地手动管理,并且语言中完全没有RAII习语.
我想无论如何这似乎都会回答你的问题.因为Objective-C对象是引用计数的,所以它们已经实现了为以下目的创建智能指针的目的:将对象的生命周期与其包含的方法的范围进行离婚或绑定. scoped_ptr可以使用自动释放池重新创建shared_ptrs ,并且-retain- -release或strong参考.
但说不,很无聊.如果你真的想要像这样混合Objective-C和C++,我们首先需要放松"Objective-C对象"的定义.运行时isa将first作为其第一个成员识别为对象,我们可以利用它并编写一个带有相应对象接口的简单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
Run Code Online (Sandbox Code Playgroud)
我们现在可以实例化一个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;
}
Run Code Online (Sandbox Code Playgroud)
正如人们所料,这会打印:
2013-12-22 17:23:22.681 Test[77528:303] I did something
I'm dying!
Run Code Online (Sandbox Code Playgroud)
到控制台.
如果需要,析构函数可以配备来调用-dealloc以模拟正确的对象破坏,但我希望你看到所有这些都是完全没必要的,特别是随着每次发布CLANG,ARC变得越来越聪明.