- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我用了这个问题的答案,List selectors for Objective-C object并列出我的类对象响应的所有选择器。在一个巨大的列表中,我发现了一个名为“.cxx_destruct”的选择器(是的,它以一个点开头),我是第一次看到它,也从未听说过它。我用谷歌搜索并找到了这个 Objective C: ARC errors (Automatic release problems) .
我有一些疑问吗?
最佳答案
在 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/
我是一名优秀的程序员,十分优秀!