为初学者自动释放

时间:2011-05-02 18:01:16

标签: iphone objective-c cocoa-touch

我发现这个非常有用的定义here

  

当你自动发布时,你基本上是在说:“我不再需要这个,但是其他任何人都可以自由选择它(在自动释放池耗尽之前)”。当你明确地重新发送你所说的一个对象时:“我不再需要它了,除非其他人已经另有说明(已获得),否则应该立即取消分配。”

     

因此,自动释放不是   通常是错误的。它是   想要传递对象时需要   回到邮件的发件人   无需发件人参加   小心释放物体。

但是,我仍然想知道第二段意味着什么。自动释放通常不是错误的做法......我认为它确实是内存密集型的,所以它自然应该是错误的。但至于最后一句话,我恐怕没有得到它。

我什么时候才真正需要使用自动释放?什么是初学者可以轻松记住的好例子/经验法则?

感谢您的任何建议。

4 个答案:

答案 0 :(得分:3)

  

自动释放通常不是错误的   要做的事......我认为这是真的   内存密集,所以它应该   自然是不对的。

根本不是“内存密集型”。如果分配和自动释放大量对象(例如循环或较少数量的大对象),则可能会遇到问题。但是自动释放只是延迟了你正在创建的对象的释放,并且当发布发生时甚至可能会解除分配(自动释放的对象也可能被其他对象保留)。

如果您可以立即释放对象,请执行此操作。如果你需要自动释放,那么这样做,不要担心内存。如果您在循环的每次迭代中创建了大量对象,您可能需要考虑使用自己的自动释放池或使用alloc / init创建所述对象,以便您可以立即释放它们。

  

但至于最后一句话,我恐怕没有得到它。

如果方法必须在返回之前释放它创建的每个对象,则无法在不要求调用者释放返回的对象的情况下返回对象。 Autorelease允许一个方法创建一个对象并释放它,但推迟释放,直到调用者有机会使用并可能保留返回的对象。

答案 1 :(得分:1)

就像你有一个类一样,它有一个随机的方法叫做:

- (NSString *)roflString { return [NSString stringWithString:@"ROFL!!!"]; }

你返回一个自动释放的对象,因为释放从你调用的每个方法中获得的对象都会很痛苦,这会使代码变得更加复杂。

因此,每当有一个方法返回一个类中的对象时,请确保在保留它之前在返回它之前自动释放它,以便调用该方法的对象不需要打扰它

答案 2 :(得分:1)

还值得注意的是,前缀为“alloc”,“new”,“copy”或“mutableCopy”的方法(例如,allocnewObject或{{1}返回一个保留的对象(你需要在完成它时释放它),而其他方法返回自动释放的对象(你不需要释放它们,但如果你想保留它们你需要保留它们)。这是Apple的惯例,你应该在实现自己的类时遵循它。

答案 3 :(得分:1)

请记住,如果您使用NSString stringWithFormat NSArray arrayWithObjects之类的方法,那么您已经获得并使用了自动释放的对象。只需遵循系统行为,在仪器或其他性能数据告诉您之前不要复杂化。