是否有任何泄漏在NSAutoreleasepool



结果如何?有任何泄漏或崩溃吗?

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

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

我认为上面的代码可能会崩溃,因为[pool drain]会导致name在返回之前被释放。

在引用计数的环境中,drain方法的行为与release相同。由于不能保留自动释放池,因此会导致接收器被释放。当一个自动释放池被释放时,它会发送一个释放消息给它的所有自动释放对象。如果一个对象被多次添加到同一个池中,当池被释放时,每次它被添加时都会收到一个释放消息。

池不是必需的,对于类似这样的操作,try -

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

更多信息可以在高级内存管理编程指南

中找到

附带说明- @autorelease { }池块比NSAutoreleasePool更好的是切换到ARC!

相关内容

  • 没有找到相关文章

最新更新