gpt4 book ai didi

ios - 自动释放池 block

转载 作者:行者123 更新时间:2023-11-28 22:35:30 25 4
gpt4 key购买 nike

我最近在读 Advanced Memory Management当我偶然发现 Autorelease Pool Blocks 时的文档。文档指出:

You may use an autorelease pool block inside a loop to dispose of those objects before the next iteration. Using an autorelease pool block in the loop helps to reduce the maximum memory footprint of the application.[...] Any object sent an autorelease message inside the autorelease pool block is released at the end of the block.

在没有自动释放调用的 block 中创建的对象呢?我假设它们的保留计数也减少到 0。那么,我的问题是,无论哪种方式调用 autorelease 有什么意义, block 内创建的对象将在 block 结束时获得释放调用?

最佳答案

可以通过向对象发送 -release-autorelease 消息来释放对象。

使用 -release 时,引用计数会立即减少,这可能会导致释放。

使用 -autorelease 递减被延迟以保持对象在其创建范围之外仍然有效。例如,辅助方法 -createFoo 可能会返回一个自动释放的对象,这样调用者就可以使用返回的对象,而无需在方法返回时立即释放该对象,也不必担心谁负责释放

使用 ARC,编译器会为您处理所有这些细节。您只需要知道,有时使用 autorelease 可以使对象存活的时间更长一些。

这种“保持事件状态”行为对如下循环有影响:

- (void)foobar
{
for (/* a long time */) {
NSMutableString *s = [NSMutableString string];
// ...
}
}

NSMutableString 上的+string 方法将返回一个自动释放的对象。这不会在循环迭代或方法结束时自动释放(好吧,ARC 可以通过查看调用堆栈来做一些巧妙的优化,但我们将忽略它)。这意味着当您在循环体内时,您将获得无限的内存增长。

请注意,如果我们使用了以下内容:

NSMutableString *s = [[NSMutableString alloc] init];

然后 ARC 会在循环体的末尾插入一个 release 调用,字符串会立即被释放。

为了解决第一个示例的无限制内存增长,您定义了一个显式的自动释放池:

- (void)foobar
{
for (/* a long time */) {
@autoreleasepool {
NSMutableString *s = [NSMutableString string];
// ...
}
}
}

现在,在循环的每次迭代之后,自动释放池被销毁,池中自动释放的任何对象(包括我们的字符串)将立即被释放。

所以这完全取决于您调用的方法种类以及它们是否返回自动释放的对象。

关于ios - 自动释放池 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16162878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com