NSAutoreleasepool 有泄漏吗?

Is there any leak in NSAutoreleasepool?

结果会怎样?有没有泄漏或崩溃??

-(NSString)returnPersonName {
NSAutorelease *pool = [[NSAutorelease alloc]init];
NSString *name = [[[NSString alloc]initWithString:@"Name"]autorelease];
[pool drain];
return name
}

有点让我困惑。

我提示上述内容可能会崩溃,因为 [pool drain] 会导致 name 在返回之前被释放。

In a reference-counted environment, the drain method behaves the same as release. Since an autorelease pool cannot be retained, this therefore causes the receiver to be deallocated. When an autorelease pool is deallocated, it sends a release message to all its autoreleased objects. If an object is added several times to the same pool, when the pool is deallocated it receives a release message for each time it was added.

池不是必需的,对于这样的东西试试 -

-(NSString*)returnPersonName {
     NSString *name = [[[NSString alloc]initWithString:@"Name"]autorelease];
     return name;
     }

可以在 Advanced Memory Management Programming Guide

中找到更多信息

旁注 - @autorelease { } 池块比 NSAutoreleasePool 更好用 甚至更好 切换到圆弧!

  1. 这段代码违反了内存管理规则。您执行 alloc,因此您获得了 +1 引用计数的所有权,然后您对其执行了 autorelease,由此您放弃了您对引用计数的所有权。因此,您不应再使用 name,并且不能保证指向有效对象。你 return 它,一个指向可能无效对象的指针。
  2. 在这种特殊情况下,由于 Cocoa 的实施细节,"bad" 不会发生任何事情。该函数的主体相当于 return @"Name";@"Name" 是字符串文字,字符串文字存储在静态存储中,该存储在程序的整个生命周期内都存在。这意味着那些字符串对象不受内存管理——retainrelease 对它们没有影响。你对它做 [[NSString alloc] init...],但是 NSString 的初始化器被优化为简单地保留和 return 它的参数,如果参数已经是一个不可变的字符串。所以你不是 returning 一个新的 NSString 对象;您只是 returning 静态分配的相同字符串文字,不受内存管理的约束。同样,所有这些都是您不能依赖的 Cocoa 的实现细节。