ObjC程序中对象的自动释放

时间:2012-05-05 10:43:25

标签: objective-c

这里我们有一些来自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程序中的自动释放对象池?

感谢。

1 个答案:

答案 0 :(得分:1)

autorelease推送到对象的自动释放池被释放/耗尽显式时,释放自动释放的对象,前提是该对象的保留计数是0+(也就是说,除了自动释放池之外没有其他人保留它)。

对象没有因为超出范围而被自动释放。在你的例子中,我们只能肯定地说它不会在结束大括号之前发布,但正如H2CO3所说,没有相关的源代码,我们无法预测何时实际清理它。在Cocoa(Touch)应用程序中,带有runloops的线程有一个循环级自动释放池,它们会在每次runloop迭代结束时消耗掉。如果从runloop调用方法(例如,作为事件处理程序回调的一部分),则在处理程序代码返回后不久将释放自动释放的对象;否则没有这样的保证。

请注意,上述内容适用于非ARC环境;其他人可以在使用ARC时确认它是否仍然有效。