使用C+管理objective-C对象+;标准::唯一性\u ptr<&燃气轮机;或标准::共享\u ptr<&燃气轮机; Objto-C可以在一定程度上与C++混合。但是Objective-C对象仍然或多或少是手工管理的,RAII习语完全不存在于语言中。我想知道是否可以用C++智能指针管理Objtovi-C对象的生命周期。特别是现在,boostscoped_ptr和shared_ptr都被添加到了C++11标准中
但是Objective-C对象仍然或多或少是手工管理的,RAII习语完全不存在于语言中 我想这似乎可以回答你的问题。因为Objective-C对象是引用计数的,所以它们已经实现了创建智能指针的目的:将对象的生命周期与其包含的方法的范围分离或绑定<代码>作用域的ptrs可以使用自动释放池重新创建,而使用C+管理objective-C对象+;标准::唯一性\u ptr<&燃气轮机;或标准::共享\u ptr<&燃气轮机; Objto-C可以在一定程度上与C++混合。但是Objective-C对象仍然或多或少是手工管理的,RAII习语完全不存在于语言中。我想知道是否可以用C++智能指针管理Objtovi-C对象的生命周期。特别是现在,boostscoped_ptr和shared_ptr都被添加到了C++11标准中,c++,objective-c,memory-management,raii,C++,Objective C,Memory Management,Raii,但是Objective-C对象仍然或多或少是手工管理的,RAII习语完全不存在于语言中 我想这似乎可以回答你的问题。因为Objective-C对象是引用计数的,所以它们已经实现了创建智能指针的目的:将对象的生命周期与其包含的方法的范围分离或绑定作用域的ptrs可以使用自动释放池重新创建,而共享的ptrs可以使用-保留--释放或强引用 但是说不很无聊。如果你真的想把ObjtoE-C和C++结合到一起,我们需要首先放松“Objtovi-C对象”的定义。运行时识别任何一个代码为“ISA/的对象作为对象
共享的ptr
s可以使用-保留--释放或强引用
但是说不很无聊。如果你真的想把ObjtoE-C和C++结合到一起,我们需要首先放松“Objtovi-C对象”的定义。运行时识别任何一个代码为“ISA/<代码>的对象作为对象的第一个成员,我们可以利用它,编写一个简单的C++类,它有一个相应的对象接口,这样就可以被消息:< /P>
@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;
}
到控制台
如果需要,析构函数可以被调用以通过<代码> -DEOLC/来模拟正确的对象销毁,但是我希望你看到所有这些都是完全不必要的,尤其是随着ARC的每一次释放,ARC变得更聪明。< / P>我对C++的了解远小于ObjuleC,所以我可能完全错了你的问题。但是,如果你有ARC(自动引用计数),为什么你需要为ObjtoE-C对象提供C++智能指针?ARC需要显式地发送发布消息。在C++中,当本地实例变量超出范围(即使用它返回或抛出的函数)时,发送等效减量消息,但编译器使用ARC将必要的保留/释放消息插入编译的代码中。因此,从程序员的角度来看,如果对象超出范围,它将自动释放。
2013-12-22 17:23:22.681 Test[77528:303] I did something
I'm dying!