0

就在我以为我已经完全理解了这个话题时,我又回到了基础。

我有一个实例化自动释放对象的方法,使用(例如)stringWithFormat

return [NSString stringWithFormat:@"what"];

然后我从另一个方法和另一个方法调用这个方法,每次都返回这个 autoreleasedNSString并在层次结构的每个级别。代码工作正常,并且NSString实例在层次结构的每个级别都是完整的。

认为由于实例是自动释放的,它可能会突然retainCount在调用堆栈中的任何点以 0 结束(即,其中一种方法将在释放的对象上工作)。我不能依赖这个对象是真的吗?

编辑:我意识到这个问题并不太清楚。对不起。我是说:

Method1 ---calls--->    Method2 ---calls---> Method3 ---instantiates the string---> 
4

2 回答 2

4

答案是 NSAutoreleasePool 在所有方法调用之后都被耗尽了,你又回到了运行循环中。这意味着在调用堆栈中,只要您不返回运行循环,对象就不会被释放。

于 2010-09-28T20:55:29.737 回答
1

可以安全地假设自动释放的对象不会在分配它的帧下方的堆栈帧中被释放。所以,在一个调用堆栈中

method1
  method2 <== instance allocated/autoreleased here
   method3 <== safe to use here

假设方法 2 中的实例 alloc/autoreleased 在方法 3 中有效是安全的,除非您玩恶作剧并从方法 3 中耗尽在方法 1 中创建的池。这是因为较高帧中的自动释放池不能在较低帧中耗尽(除非出于愚蠢)。当然,一旦控制权返回到方法 1,所有的赌注都没有了。

分配在较低框架中的自动释放池将不包含在方法 2 中自动释放的实例,因为它们在自动释放时可能不是活动池(它们尚未创建!)。

最后,除非调用链中较低的方法,感兴趣的方法和实例化和自动释放对象实例的方法之间创建并排出自动释放池,否则可以确保封闭池在运行结束之前不会被排出环形。

于 2010-09-28T21:10:07.607 回答