循环中的NSAutoreleasePool

Ram*_*uri 1 objective-c nsautoreleasepool

假设我有这样的代码:

NSAutoreleasePool* pool=[[NSAutoreleasePool alloc]init];
for(unsigned int i=0;i<10;i++)
{
    NSDate* date=[[NSDate alloc]init];
}
[pool drain];
Run Code Online (Sandbox Code Playgroud)

请注意,此代码的目的只是展示我可以做的事情,这是我通常做的简化.因此,在每次迭代中,都会分配并初始化新的NSDate.NSAutoreleasePool是否将它们全部耗尽,或者我是否必须以这种方式在循环中添加NSAutoreleasePool:

for(unsigned int i=0;i<10;i++)
{
    NSAutoreleasePool* pool=[[NSAutoreleasePool alloc]init];
    NSDate* date=[[NSDate alloc]init];
    [pool drain];
}
Run Code Online (Sandbox Code Playgroud)


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

@autoreleasepool
{
    <code>
}
Run Code Online (Sandbox Code Playgroud)

我已阅读,这种方式比使用NSAutoreleasePool更有效,但如果我使用它,我得到一个语法错误:
"在节目意外'@’"
为什么呢?

我试过这样修改代码:

NSAutoreleasePool* pool=[[NSAutoreleasePool alloc]init];
for(unsigned int i=0;i<10;i++)
{
    NSDate* date=[[NSDate alloc]init];
    [date autorelease];
}
[pool drain];
Run Code Online (Sandbox Code Playgroud)

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

bbu*_*bum 5

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

通常,当您有可量化的性能问题表明需要时,您应该只在代码中使用自动释放池.不要修复你没有的问题.

如果@autoreleasepool不起作用,那是因为您正在使用较旧的编译器.