Hem*_*ang 21 objective-c selector ios
我使用了这个问题的答案,为Objective-C对象列出了选择器,并列出了我的类对象正在响应的所有选择器.在一个巨大的列表中,我找到了一个名为".cxx_destruct"的选择器(是的,它以点开头),我第一次看到这个,并且从未听说过它.我用Google搜索并找到了这个目标C:ARC错误(自动释放问题).
我脑子里有些问题吗?
Pet*_*esh 23
在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;
}
Run Code Online (Sandbox Code Playgroud)
当我们使用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 它,因为它不再需要.
| 归档时间: |
|
| 查看次数: |
6331 次 |
| 最近记录: |