NSAutoreleasepool有泄漏吗?

时间:2015-07-28 12:14:13

标签: ios memory-leaks pool autorelease nsautoreleasepool

会有什么结果?有没有泄漏或崩溃?

-(NSString)returnPersonName {
NSAutorelease *pool = [[NSAutorelease alloc]init];
NSString *name = [[[NSString alloc]initWithString:@"Name"]autorelease];
[pool drain];
return name
}
对我有点困惑。

2 个答案:

答案 0 :(得分:3)

  1. 此代码违反了内存管理规则。您执行了alloc,因此您获得了+1引用计数的所有权,然后对其执行autorelease,您将放弃对引用计数的所有权。因此,您不应再使用name,并且不能保证指向有效对象。你返回它,指向一个可能无效的对象的指针。
  2. 在这种特殊情况下,由于Cocoa的实现细节,没有什么"坏"会发生的。该函数的主体仅相当于return @"Name";@"Name"是字符串文字,字符串文字存储在程序的整个生命周期中存在的静态存储中。这意味着这些字符串对象不受内存管理 - retainrelease对它们没有影响。你对[[NSString alloc] init...]进行了NSString,但NSString的初始值设定项已经过优化,只需保留并返回其参数(如果参数已经是不可变的字符串)。所以你没有返回一个新的import matplotlib.pyplot as plt import numpy as np def make_plot(slope): x = np.arange(1,10) y = slope*x+3 plt.figure() plt.plot(x,y) make_plot(2) make_plot(3) 对象;你只是返回相同的字符串文字,静态分配,不受内存管理。同样,所有这些都是你不能依赖的Cocoa的实现细节。

答案 1 :(得分:2)

我倾向于上述情况可能会导致崩溃,因为[pool drain]会导致名称被取消分配,然后才能返回。

  

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

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

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

可以在Advanced Memory Management Programming Guide

中找到更多信息

另一方面 - 使用@autorelease { }池块比 NSAutoreleasePool 更好,甚至更好切换到ARC!