ARC 是否会自动将类初始值设定项的自动发布版本转换为适当的非自动发布版本,或者它们在技术上仍然是自动发布的?
我不想保留内存超过绝对需要的时间,所以我养成了在几乎所有情况下都使用 alloc/init 的习惯。现在在 ARC 中,我想知道我是否可以开始使用“自动释放”初始化程序并期望它们像非自动释放版本一样表现......
有没有人有任何文档说明我在哪里可以找到 ARC 下自动发布的方法会发生什么?
ARC 是否会自动将类初始值设定项的自动发布版本转换为适当的非自动发布版本,或者它们在技术上仍然是自动发布的?
我不想保留内存超过绝对需要的时间,所以我养成了在几乎所有情况下都使用 alloc/init 的习惯。现在在 ARC 中,我想知道我是否可以开始使用“自动释放”初始化程序并期望它们像非自动释放版本一样表现......
有没有人有任何文档说明我在哪里可以找到 ARC 下自动发布的方法会发生什么?
当您获得自动释放对象时,只要您的代码和调用的方法/函数都使用 ARC 编译,ARC 将设法避免自动释放池。
ARCobjc_retainAutoreleasedReturnValue
在您的代码中添加一个调用,并objc_autoreleaseReturnValue
在被调用的函数/方法中添加一个调用。在运行时,当objc_autoreleaseReturnValue
看到返回的值将由 保留时objc_retainAutoreleaseReturnValue
,它不会自动释放对象并设置一个标志来告诉objc_retainAutoreleaseReturnValue
不要保留该对象。因此,使用方便的创建方法而不是alloc
/ ,您不会获得(可察觉的)额外成本init
。
有关该机制的更多信息,您可以阅读objc_retainAutoreleasedReturnValue 如何工作?由马特加洛韦。
总之,只要使用您喜欢的方法,Apple 工程师将确保它运行得很快。
从技术上讲,它们并不相同,因为 ARC 在编译时只是将“保留”和“发布”插入到您的代码中(在必要时)。
如果在初始化对象时使用指针,ARC 会存储对对象的强引用,否则会立即释放对象。所以我相信你关于 NSArray 的问题的答案是不,ARC 不会把它变成一个自动释放的对象。每当范围内不再需要对象时,它还会在代码中添加一个 release 语句:
-(void) aMethod
{
[NSArray alloc];
}
//in essence is transformed into
-(void) aMethod
{
NSArray *temp = [NSArray alloc];
[temp release];
}
如果您存储了一个指针,ARC 会在对象即将离开作用域时添加一个释放。