我发现这个非常有用的定义here:
当你自动发布时,你基本上是在说:“我不再需要这个,但是其他任何人都可以自由选择它(在自动释放池耗尽之前)”。当你明确地重新发送你所说的一个对象时:“我不再需要它了,除非其他人已经另有说明(已获得),否则应该立即取消分配。”
因此,自动释放不是 通常是错误的。它是 想要传递对象时需要 回到邮件的发件人 无需发件人参加 小心释放物体。
但是,我仍然想知道第二段意味着什么。自动释放通常不是错误的做法......我认为它确实是内存密集型的,所以它自然应该是错误的。但至于最后一句话,我恐怕没有得到它。
我什么时候才真正需要使用自动释放?什么是初学者可以轻松记住的好例子/经验法则?
感谢您的任何建议。
答案 0 :(得分:3)
自动释放通常不是错误的 要做的事......我认为这是真的 内存密集,所以它应该 自然是不对的。
根本不是“内存密集型”。如果分配和自动释放大量对象(例如循环或较少数量的大对象),则可能会遇到问题。但是自动释放只是延迟了你正在创建的对象的释放,并且当发布发生时甚至可能会解除分配(自动释放的对象也可能被其他对象保留)。
如果您可以立即释放对象,请执行此操作。如果你需要自动释放,那么这样做,不要担心内存。如果您在循环的每次迭代中创建了大量对象,您可能需要考虑使用自己的自动释放池或使用alloc / init创建所述对象,以便您可以立即释放它们。
但至于最后一句话,我恐怕没有得到它。
如果方法必须在返回之前释放它创建的每个对象,则无法在不要求调用者释放返回的对象的情况下返回对象。 Autorelease允许一个方法创建一个对象并释放它,但推迟释放,直到调用者有机会使用并可能保留返回的对象。
答案 1 :(得分:1)
就像你有一个类一样,它有一个随机的方法叫做:
- (NSString *)roflString { return [NSString stringWithString:@"ROFL!!!"]; }
你返回一个自动释放的对象,因为释放从你调用的每个方法中获得的对象都会很痛苦,这会使代码变得更加复杂。
因此,每当有一个方法返回一个类中的对象时,请确保在保留它之前在返回它之前自动释放它,以便调用该方法的对象不需要打扰它
答案 2 :(得分:1)
还值得注意的是,前缀为“alloc”,“new”,“copy”或“mutableCopy”的方法(例如,alloc
,newObject
或{{1}返回一个保留的对象(你需要在完成它时释放它),而其他方法返回自动释放的对象(你不需要释放它们,但如果你想保留它们你需要保留它们)。这是Apple的惯例,你应该在实现自己的类时遵循它。
答案 3 :(得分:1)
请记住,如果您使用NSString stringWithFormat NSArray arrayWithObjects之类的方法,那么您已经获得并使用了自动释放的对象。只需遵循系统行为,在仪器或其他性能数据告诉您之前不要复杂化。