该方法getFoo
不返回保留计数为 0 的对象。它返回一个具有+0 保留计数的对象,这意味着:
- 对象的保留计数不为空(否则,该对象将不存在)
- 并且保留计数没有被方法的调用改变,或者如果它是,它是以一种平衡的方式(与
release
/ autorelease
as retain
/ alloc
/ new
/一样多copy
)。
因此,对象的生命周期完全取决于它被保留的位置和方式。我们不知道该对象将有效多长时间,因为任何方法调用都可能释放该对象。
例如,让我们考虑以下代码:
id anObject = [anArray objectAtIndex:0];
[anArray removeObjectAtIndex:0];
当我们删除它时,该对象anObject
不再被数组保留。因此它可能已被破坏(但也许不是因为它仍在其他地方使用)。
alloc
通常,当从方法(除、或)获取对象时copy
,我们可以假设:new
retain
- 要么对象被保留然后自动释放,
- 要么对象被返回它的对象保留。
所以我们知道对象foo
是有效的,直到我们从当前方法/函数返回,或者我们调用改变对象状态的方法/函数bar
,以先到者为准。在那之后,它可能已经被破坏了。
因此,在您的情况下,您可以安全地省略retain
/release
对。
然而,除非我们知道我们调用的每个方法的实现,否则很难保证一个对象不会被释放。因此,保留(然后释放)我们获得的每一个对象是更安全的方法,这也是当您启用 ARC(自动引用计数)时编译器将执行的操作。
但这将需要您编写大量retain
/release
并且您的代码将变得难以阅读、理解和维护。而且,你写的代码越多,得到的 bug 就越多(除非你从不写 bug)。
总之,除非您有理由怀疑它可能会消失,否则您不需要保留对象。