【问题标题】:iOS : ".cxx_destruct" - a hidden selector in my classiOS:“.cxx_destruct”-我班上的隐藏选择器
【发布时间】:2014-06-09 10:44:58
【问题描述】:

我使用了这个问题的答案List selectors for Objective-C object 并列出了我的类对象响应的所有选择器。在一个巨大的列表中,我发现了一个名为“.cxx_destruct”的选择器(是的,它以点开头),我第一次看到这个,也从未听说过。我用谷歌搜索它并找到了这个Objective C: ARC errors (Automatic release problems)

我有一些问题?

  • 是否与 ARC 有关?
  • 如果是选择器,为什么要隐藏?
  • 什么时候打电话?由谁,iOS 本身?
  • 为什么它命名为 .cxx_destruct? “cxx”的全称是什么?

【问题讨论】:

  • 是的。因为它与 ARC 相关,不应手动调用。当您的对象被释放时。由目标 C 运行时。命名模式是因为它与 c++ 的析构函数有关。
  • @Petesh,您能否为此参考 Apple Doc?
  • 我没有提到这个;它更多的是编译器级别,而不仅仅是 Apple 特定的。当您有对象类型的实例变量时,编译器会自动发出.cxx_destructor,以确保它们在销毁时自动取消引用。这就是您不需要编写 dealloc 例程来清空所有属性的原因。它有 .cxx_destructor 标题,因为它利用了 Objective-C++ 析构函数的行为。
  • @Petesh,感谢您的努力,请让您的 cmets 回答,所以我会接受。
  • 我们在没有ARC的情况下编译(clang -fno-objc-arc test.m -o test -framework foundation),

标签: ios objective-c selector


【解决方案1】:

在 ARC 之前,开发人员必须特意编写一个 dealloc 例程,以确保释放对他们保留的所有对象的所有引用。这是手动且容易出错的工作。

当引入 ARC 时,执行与这些手动版本等效的任务的代码必须在每个对象中实现,而这些对象不仅具有简单的属性。依靠开发人员手动实现dealloc 例程会解决这个问题。

注意:这只是为了在销毁对象时进行引用计数管理。如果您需要移除观察者或执行其他清理工作,那么您仍然需要一个dealloc 例程。

因此,使用了来自 Objective-C++ 的预先存在的机制,即一个名为 .cxx_destruct 的隐藏选择器,它在对象被释放之前自动调用。此选择器由 Objective C 运行时自动调用。

对于 Objective C++ 代码,有一个并行的.cxx_construct 用于构造。

同样,这些是由编译器自动生成的,用于处理 ARC 上下文中的对象破坏。如果您编译一些带有和不带有对象属性的简单目标 C 代码,您可以看到它正在创建。拿这个示例代码:

#import <Foundation/Foundation.h>

@interface Foo : NSObject

@property (strong) NSObject *anobject;

@end

@implementation Foo
@end

int main()
{
    Foo *f = [[Foo alloc] init];
    return 0;
}

当我们使用 ARC (clang -fobjc-arc test.m -o test -framework foundation) 编译并转储类信息时,我们会看到 .cxx_destruct 选择器,当我们不使用 ARC (clang -fnoobjc-arc test.m -o test -framework foundation) 进行编译时,我们看不到 .cxx_destruct 选择器。如果您注释掉 NSObject *anobject 属性并重新编译,您将看不到 .cxx_destruct,因为它不再需要。

【讨论】:

  • 很好的答案!如何避免 Xcode 将其包含在代码覆盖率报告中?
  • 我不知道——不过,我没想到它们会出现在典型的覆盖率报告中,因为它们没有映射到任何源代码行。
  • 这个答案看起来还想说你不应该在ARC下实现dealloc,但那是not true
  • 这只是在发布引用的上下文中的意思。其他清理工作仍需要在dealloc 例程中实施。我会在答案中添加一个注释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多