首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >循环中的NSAutoreleasePool

循环中的NSAutoreleasePool
EN

Stack Overflow用户
提问于 2012-04-07 05:30:42
回答 2查看 793关注 0票数 1

假设我有一个这样的代码:

代码语言:javascript
复制
NSAutoreleasePool* pool=[[NSAutoreleasePool alloc]init];
for(unsigned int i=0;i<10;i++)
{
    NSDate* date=[[NSDate alloc]init];
}
[pool drain];

请注意,这段代码的目的只是为了显示我可以做什么,这是我通常做的事情的简化。因此,在每次迭代中,都会分配和初始化一个新的NSDate。是NSAutoreleasePool将它们全部排出,还是必须以这种方式将NSAutoreleasePool添加到循环中:

代码语言:javascript
复制
for(unsigned int i=0;i<10;i++)
{
    NSAutoreleasePool* pool=[[NSAutoreleasePool alloc]init];
    NSDate* date=[[NSDate alloc]init];
    [pool drain];
}

另外,我的书( mac的可可编程)并没有提到NSAutoreleasePool,它只是这样使用它:

代码语言:javascript
复制
@autoreleasepool
{
    <code>
}

我读到过这种方法比使用NSAutoreleasePool更有效,但如果我使用它,我会得到一个语法错误:

“程序中出现意外的'@‘”

为什么是这个?

我尝试过这样修改代码:

代码语言:javascript
复制
NSAutoreleasePool* pool=[[NSAutoreleasePool alloc]init];
for(unsigned int i=0;i<10;i++)
{
    NSDate* date=[[NSDate alloc]init];
    [date autorelease];
}
[pool drain];

对吗?我认为保留了10个不同的对象(计数为1),然后添加到自动释放池中。我是不是没有内存泄漏?有没有办法用gdb检查这个对象的数量?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-07 05:34:26

当您分配/初始化一个类时,返回的实例通常不会自动释放。所以,不,在这个例子中,根本不需要自动释放池。

一般来说,你应该只在你的代码中使用自动释放池,当你有可量化的性能问题,表明需要它的时候。不要解决你没有的问题。

如果@autoreleasepool不能工作,那是因为您使用的是较旧的编译器。

票数 5
EN

Stack Overflow用户

发布于 2013-06-12 12:54:45

来自苹果docs

代码语言:javascript
复制
If you write a loop that creates many temporary objects.
You may use an autorelease pool block inside the 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.

所以如果@Ramy使用:

代码语言:javascript
复制
for(unsigned int i=0;i<10;i++)
{
    NSAutoreleasePool* pool=[[NSAutoreleasePool alloc]init];
    NSDate* date=[[NSDate alloc]init];
    [date autorelease];
    [pool drain];
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10049489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档