这里我们有一些来自About Memory Management
的例子在第一个例子中
- (NSString *) fullName {
NSString *string = [[[NSString alloc] initWithFormat:@"%@ %@", self.firstName, self.lastName] autorelease];
return string;
}
在这个例子中是如何调用上述方法
{
Person *aPerson = [[Person alloc] init];
NSString *name = aPerson.fullName;
[aPerson release];
}
所以我假设在代码流到达结束花括号之后,* name是自动释放的。
这是真的吗?
一般来说,对象的自动释放取决于引用该对象的变量的范围和生命周期。
是否有任何标准可以管理Objective-C程序中的自动释放对象池?
感谢。
答案 0 :(得分:1)
当autorelease
推送到对象的自动释放池被释放/耗尽显式时,释放自动释放的对象,前提是该对象的保留计数是0+(也就是说,除了自动释放池之外没有其他人保留它)。
对象没有因为超出范围而被自动释放。在你的例子中,我们只能肯定地说它不会在结束大括号之前发布,但正如H2CO3所说,没有相关的源代码,我们无法预测何时实际清理它。在Cocoa(Touch)应用程序中,带有runloops的线程有一个循环级自动释放池,它们会在每次runloop迭代结束时消耗掉。如果从runloop调用方法(例如,作为事件处理程序回调的一部分),则在处理程序代码返回后不久将释放自动释放的对象;否则没有这样的保证。
请注意,上述内容适用于非ARC环境;其他人可以在使用ARC时确认它是否仍然有效。