autorelease关键字

时间:2011-08-17 19:17:15

标签: ios objective-c autorelease

我是目标c 2.0的新手。我遇到了这个关键字autorelease,我只需要一些澄清。我只是想知道下面两行代码之间的区别是什么 - c 2.0(提前感谢):

  1. [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];

  2. [[UIImage imageWithData:[NSData dataWithContentsOfURL:url]] autorelease];

2 个答案:

答案 0 :(得分:3)

第二行不正确。 +imageWithData:已经返回一个自动释放的对象。自动释放实际上就像释放一样,除了你仍然拥有对象的所有权,直到它超出范围。有关详细信息,请阅读Memory Management Programming Guide

另请注意,在ARC中,您将不被允许使用此方法,编译器将为您执行此操作。

答案 1 :(得分:3)

autorelease 不是关键字,它是一种方法,这意味着接收到此调用的特定对象已添加到当前的自动发布池(通常会创建)在执行事件时由Cocoa自己完成)并且一旦池被耗尽,该对象将从内存中释放,因此您不必关心进行显式释放。

如果你没有这个电话,你必须在完成使用后自行释放这个对象。

通过使用 autorelease ,您应该确保当前有一个自动发布池,就好像没有一个对象会泄漏,并且它的内存不会被声明。通常,当您处理来自Cocoa组件的事件时,您可以依赖于此,否则您应该创建自己的自动释放池。有关更多信息,请参阅the oficial Apple documentation about it

此外,您不应该在未使用 alloc 创建的对象中调用autorelease,这是基于Cocoa的库的常见行为,可以使方法初始化自动释放对象,因此,任何方法都可以创建一个对象,但不包括alloc或copy通常意味着该对象已经被自动释放,你不应该再次调用它。