0

这里我们有一些关于内存管理的例子

在第一个例子中

- (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 程序中的对象自动释放池?

谢谢。

4

1 回答 1

1

当对象被推送到的自动释放池被显式autorelease释放/排空时,自动释放对象的释放发生,前提是此时对象的保留计数为 0+(即,除了自动释放池之外没有其他人保留它)。

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

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

于 2012-05-06T13:57:39.953 回答