2011-08-17 68 views
2

我是新的目标c 2.0。我碰到这个关键字autorelease,我只是需要一些澄清。我想知道是什么低于目标的代码的两行之间的差 - C 2.0(预先感谢):autorelease关键字

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

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

回答

3

自动释放不是一个关键字,这是一个方法,这意味着接到呼叫此特定对象加入到当前的自动释放池(这通常是由可可创造自己在执行事件)和一次池被耗尽,这个对象将从内存中释放,所以你不必关心做一个明确的释放。

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

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

而且,你不应该在你还没有ALLOC创建的对象调用自动释放,它是一个基于图书馆有自动释放对象初始化方法可可共同的行为,因此,创建一个对象的任何方法,但不包含alloc或copy通常意味着该对象已经被autoreleased并且不应该再次调用它。

+0

感谢您的解释。我使用xcode分析功能来确定第二行是不正确的。 –

3

第二行是不正确的。 +imageWithData:已经返回一个自动释放对象。自动释放实际上就像是释放,除非您在对象超出范围之前仍拥有对象的所有权。阅读Memory Management Programming Guide获取更多信息。

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

+0

谢谢你的解释。我使用xcode分析功能来确定第二行是不正确的。 –