使用 ARC 时,[[NSArray alloc] init] 和 "autorelased" [NSArray array] 之间有区别吗?



可能的重复项:
Objective-C:有了ARC,什么更好?分配或自动发布初始值设定项?

ARC 是否会自动将类初始值设定项的自动发布版本转换为适当的非自动发布版本,或者它们在技术上是否仍在自动发布?

我不想将内存保留超过绝对需要的时间,所以我已经养成了在几乎所有情况下都使用 alloc/init 的习惯。 现在在 ARC 中,我想知道我是否可以开始使用"自动发布"初始值设定项并期望它们像非自释放版本一样运行......

有没有人有任何文档说明我可以在哪里找到 ARC 下自动发布的方法会发生什么?

当你得到一个自动释放的对象时,只要你的代码和被调用的方法/函数都是用 ARC 编译的,ARC 就会设法避开自动释放池。

ARC 在代码中添加对objc_retainAutoreleasedReturnValue的调用

,并在调用的函数/方法中添加对objc_autoreleaseReturnValue的调用。在运行时,当objc_autoreleaseReturnValue看到返回的值将被objc_retainAutoreleaseReturnValue保留时,它不会自动释放对象并设置一个标志来告诉objc_retainAutoreleaseReturnValue不要保留该对象。因此,使用方便的创建方法而不是alloc/init,您不会获得(可察觉的)额外费用。

有关该机制的更多信息,您可以阅读Matt Galloway的objc_retainAutoreleasedReturnValue如何工作?

总之,只需使用您喜欢的方法,Apple工程师将确保它运行得更快。

从技术上讲,它们并不相同,因为 ARC 只是在编译时将"保留"和"发布"插入到代码中(如有必要)。

如果在启动对象时使用指针,ARC 会存储对对象的强引用,否则它会立即解除分配对象。所以我相信你关于NSArray的问题的答案是不,ARC不会把它变成一个自动释放的对象。它还会在作用域中不再需要对象时向代码添加发布语句:

-(void) aMethod
{
    [NSArray alloc];
}
//in essence is transformed into
-(void) aMethod
{
    NSArray *temp = [NSArray alloc];
    [temp release];
}

如果您存储了指针,ARC 会在对象即将离开范围时立即添加释放。

最新更新