就在我认为我完全理解这个话题的时候,我又回到了基础。
我有一个使用(例如)stringWithFormat
实例化自动释放对象的方法:
return [NSString stringWithFormat:@"what"];
然后我从另一个方法和另一个方法调用此方法,每次返回此自动释放的NSString
并在层次结构的每个级别。代码工作正常,NSString
实例在层次结构的每个级别都是完整的。
我想,因为实例是自动释放的,所以它可能会突然在调用堆栈中的任何一点以retainCount
为0结束(即,其中一个方法将起作用在已发布的对象上)。 我不能依赖这个对象吗?
编辑:我意识到这个问题不太清楚。抱歉。我的意思是:
Method1 ---calls---> Method2 ---calls---> Method3 ---instantiates the string--->
答案 0 :(得分:4)
答案是NSAutoreleasePool在所有方法调用之后被耗尽,并且您又回到了运行循环中。这意味着在调用堆栈中,只要您不返回运行循环,就不会释放该对象。
答案 1 :(得分:1)
可以安全地假设自动释放的对象不会在分配帧的帧下面的堆栈帧中释放。所以,在像
这样的调用堆栈中method1
method2 <== instance allocated/autoreleased here
method3 <== safe to use here
可以安全地假设方法2中的实例alloc / autoreleased在method3中有效,除非你玩一些讨厌的技巧并从method3中排除在method1中创建的池。这是因为较高帧中的自动释放池不能在较低帧中耗尽(除非是愚蠢)。当然,一旦控制权返回到method1,所有投注都将被取消。
在较低帧中分配的自动释放池将不包含在method2中自动释放的实例,因为它们在自动释放时不能是活动池(它们尚未创建!)。
最后,除非调用链中较低的方法,感兴趣的方法之间的以及实例化和自动释放对象实例的方法创建并排出自动释放池,您可以放心,在运行循环结束之前,封闭池不会被耗尽。