【问题标题】:When using ARC, is there a difference between [[NSArray alloc] init] and the "autorelased" [NSArray array]? [duplicate]使用 ARC 时,[[NSArray alloc] init] 和“自动相关”[NSArray array] 之间有区别吗? [复制]
【发布时间】:2012-06-25 17:37:45
【问题描述】:
【问题讨论】:
标签:
iphone
objective-c
automatic-ref-counting
【解决方案1】:
当您获得自动释放对象时,ARC 将设法避开自动释放池,只要您的代码和调用的方法/函数都使用 ARC 编译。
ARC 在您的代码中添加对objc_retainAutoreleasedReturnValue 的调用,并在被调用的函数/方法中添加对objc_autoreleaseReturnValue 的调用。在运行时,当objc_autoreleaseReturnValue 看到返回的值将由objc_retainAutoreleaseReturnValue 保留时,它不会自动释放对象并设置一个标志来告诉objc_retainAutoreleaseReturnValue 不要保留该对象。因此,使用方便的创建方法而不是alloc/init,您不会获得(可察觉的)额外成本。
有关该机制的更多信息,您可以阅读 Matt Galloway 的 How does objc_retainAutoreleasedReturnValue work?。
总之,只要使用你喜欢的方法,Apple 工程师就会确保它运行得很快。
【解决方案2】:
从技术上讲,它们并不相同,因为 ARC 只是在编译时将“保留”和“释放”插入到您的代码中(在必要时)。
【解决方案3】:
如果在初始化对象时使用指针,ARC 会存储对对象的强引用,否则它会立即释放对象。所以我相信你关于 NSArray 的问题的答案是不,ARC 不会把它变成一个自动释放的对象。每当范围内不再需要该对象时,它还会在代码中添加一个 release 语句:
-(void) aMethod
{
[NSArray alloc];
}
//in essence is transformed into
-(void) aMethod
{
NSArray *temp = [NSArray alloc];
[temp release];
}
如果您存储了一个指针,ARC 会在对象即将离开作用域时添加释放。