gpt4 book ai didi

iOS : ".cxx_destruct" - a hidden selector in my class

转载 作者:IT王子 更新时间:2023-10-29 08:03:37 25 4
gpt4 key购买 nike

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

我有一些疑问吗?

  • 是否与 ARC 相关?
  • 如果它是一个选择器,为什么它是隐藏的?
  • 它什么时候打电话?由谁,一个 iOS 本身?
  • 为什么它的名字像.cxx_destruct? “cxx”的完整形式是什么...?

最佳答案

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

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

Note: This is just for the purposes of reference count management when destroying objects. If you need to remove observers or perform other cleanup work, then you'll still need a dealloc routine.

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

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

同样,这些是由编译器自动生成的,用于处理 ARC 上下文中的对象销毁。如果您编译一些带有或不带有对象属性的简单 Objective-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,因为它不再需要了。

关于iOS : ".cxx_destruct" - a hidden selector in my class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24118588/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com