ios - Objective-C 自动释放内存管理

标签 ios iphone objective-c cocoa-touch

我试图了解何时调用自动释放,以及这实际上会对我的对象做什么。

看完About Memory Management在 Mac Developer Library 中,我了解到当您有一个充当工厂方法的方法时 - 通过创建一个新对象并返回它 - 该方法无法在返回之前释放该对象,因为这会导致释放对象被退回。

示例

- (Test *) createNewTest 
{
    Test *newInstance = [[Test alloc] init];
    [newInstance release];
    return newInstance; // deallocted object returned.
}

我应该使用 autorelease:

The autorelease method, defined by NSObject, marks the receiver for later release

我的问题是:如果对象要稍后释放,我怎么知道它什么时候被释放?

- (Test *) createNewTest 
{
    Test *newInstance = [[test alloc] init];
    [newInstance autorelease];
    return newInstance;
}

- (void) runIt
{
    Test *myInstance = [self createNewTest];
    // when is myInstance released?? and thereby not valid to my function anymore?
}

如果我不知道自动释放何时发生,如何在我的 runIt 方法中安全地使用返回的自动释放对象?我应该保留 createNewTest 返回的对象吗?或者我可以在 runIt 范围内安全地使用它吗?

最佳答案

自动释放对象被添加到自动释放池。

自动释放池中的对象在主运行循环的迭代结束时释放(或者如果您管理自己的自动释放池和/或如果您调用 drain 则更快)。

当您调用一个返回自动释放对象的方法时,它几乎可以保证至少在调用它的范围结束之前保持有效。

如果你想确保它存活得更久,那么你应该保留它,记得在你用完它时再次释放它。

关于ios - Objective-C 自动释放内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5192308/

相关文章:

ios - UIWebView 显示没有内容的黑屏

iphone - 如何将 UIView 隐藏和显示(动画)为 UIActionSheet?

html - 使用jquery mobile为iOS设置phonegap

objective-c - 我有一个循环引用。如何在 Objective-C 中创建弱引用?

iphone - 在 iOS 中使用 XMPP 连接到 Openfire 服务器

objective-c - dispatch_sync(dispatch_get_main_queue() UI 怪异

iphone - UINavigationBar 调用 drawRect : if subclassed but not when using categories in iOS 5?

ios - 选择 UITableView 中所有行的更简单方法

iphone - UITableView自定义单元格滚动后内容消失

ios - _Nullable周围的星星