【问题标题】:Destructor in Objective-C++Objective-C++ 中的析构函数
【发布时间】:2011-03-09 07:48:16
【问题描述】:

我有一个 Objective-C++ 类,其中包含一些诚实的 C++ 对象指针。

当 Obj-C++ 类被销毁时,它会立即调用 dealloc 吗?如果是这样,那么通过放置

来销毁 C++ 类是最好的方法
delete obj

在dealloc方法中?

【问题讨论】:

    标签: objective-c cocoa objective-c++


    【解决方案1】:

    作为对 Frank Shearar 正确答案的补充,如果您使用的是 OSX 10.4 或更高版本的 SDK(您可能是;虽然我不确定这里的 iPhone 运行时),您还可以包含 Objective-C 的 C++ 成员类,即不诉诸指针。早期版本的 OSX SDK 中的问题是 C++ 成员的构造函数和析构函数根本不会被调用。但是,通过指定 fobjc-call-cxx-cdtors 编译器选项(在 XCode 中它被公开为设置 GCC_OBJC_CALL_CXX_CDTORS),ctor 和 dtor 将被调用。另请参阅Apple docs,位于该页面下方。

    【讨论】:

    • 当您需要存储指针时也可以使用,只要您包装它,例如在std::unique_ptr
    【解决方案2】:

    我想当你说“Obj-C++ 类”时,你的意思是一个 Objective-C 类,它恰好包含一些 C++ 类。

    Objective-C 类在销毁时不会调用 dealloc;将 dealloc 消息发送给它们会破坏它们。

    有了一点迂腐,如果你的 init 方法实例化了 obj 那么,是的,在 dealloc 中调用 delete obj

    -(void)dealloc {
      delete obj;
      [super dealloc];
    }
    

    【讨论】:

    • ARC 禁止发送 dealloc 消息 - 使用 ARC 时无需致电 [super dealloc] 回答 here
    • @benjineer ARC 在写这个答案时还没有发布,但你是对的,[super dealloc] 与 ARC 不兼容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 2014-12-20
    • 2014-05-27
    相关资源
    最近更新 更多