objective-c – 我们可以有多个NSAutoReleasePools吗?为什么这是必要的?

objective-c – 我们可以有多个NSAutoReleasePools吗?为什么这是必要的?,第1张

概述NSAutoreleasePool ..应该只有一个吗?为什么你想拥有更多呢?您是否希望将一个以上的游泳池作为单个班级的一部分? 如果你有多个池,哪一个将包含被要求的对象[autorelease] d?有没有办法找出哪些对象等待作为池的一部分自动释放? 对不起20个问题,请帮助我更好地理解这一点 NSAutoreleasePool .. should there be only one? 不,不一 NSautoreleasePool ..应该只有一个吗?为什么你想拥有更多呢?您是否希望将一个以上的游泳池作为单个班级的一部分?

如果你有多个池,哪一个将包含被要求的对象[autorelease] d?有没有办法找出哪些对象等待作为池的一部分自动释放?

对不起20个问题,请帮助我更好地理解这一点

解决方法

NSautoreleasePool .. should there be
only one?

不,不一定.您可以根据需要创建任意数量的自动释放池.

Why would you want to have more then
one? Would you ever want to have more
than one pool as part of a single
class?

我们的想法是尽可能降低你的记忆“高水位线”.使用自动释放是一种作弊,推迟释放你的对象直到“以后”.有时你知道什么时候“以后” – 在这些情况下,制作你自己的自动释放池可能很聪明.

这一切是什么意思?好吧,想象你有以下循环:

for (...){     // 1 MB of objects are added to the autorelease pool by some code...}

1 MB是很多!如果该代码循环20次,则有20MB的对象等待释放.更糟糕的是,如果它无限期地或无限期地运行,你的应用程序可能会崩溃.如果您知道代码是自包含的,则可以通过手动创建自己的自动释放池来强制放入该块中的自动释放池中的任何内容,如下所示:

for (...){     NSautoreleasePool * pool = [[NSautoreleasePool alloc] init];     // 1 MB of objects are added to the autorelease pool by some code...     [pool drain];}

现在你的“高水位线”只有1MB而不是20MB(或更多!).

If you have multiple pools,which one
will contain object that was asked for
be [autorelease]d?

最近的一个.

想象一下拥有全局堆栈.当您初始化一个新的autoreleasePool时,它会将自己添加到此全局自动释放池堆栈中.当您在对象上调用[xxx autorelease]时,autorelease方法会查看此堆栈顶部的自动释放池,并将自身添加到该自动释放池的对象列表中.当你调用[pool drain]时,该池循环遍历所有已添加到它的引用,并在所有引用上调用[xxx release].

正如BJ Homer指出的那样,上面段落中的堆栈实际上并不是真正的全局 – 每个线程实际上有一个堆栈.但我无法弄清楚如何重写上面的段落,并通过使用像“线程本地”这样的术语来保持它易于理解……所以…这个附录必须足够:)

总结

以上是内存溢出为你收集整理的objective-c – 我们可以有多个NSAutoReleasePools吗?为什么这是必要的?全部内容,希望文章能够帮你解决objective-c – 我们可以有多个NSAutoReleasePools吗?为什么这是必要的?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1021560.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存