Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用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 - Fatal编程技术网

使用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对象+;标准::唯一性\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/的对象作为对象

但是Objective-C对象仍然或多或少是手工管理的,RAII习语完全不存在于语言中

我想这似乎可以回答你的问题。因为Objective-C对象是引用计数的,所以它们已经实现了创建智能指针的目的:将对象的生命周期与其包含的方法的范围分离或绑定<代码>作用域的ptrs可以使用自动释放池重新创建,而
共享的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!