会有什么结果?有没有泄漏或崩溃?
-(NSString)returnPersonName {
NSAutorelease *pool = [[NSAutorelease alloc]init];
NSString *name = [[[NSString alloc]initWithString:@"Name"]autorelease];
[pool drain];
return name
}
对我有点困惑。
答案 0 :(得分:3)
alloc
,因此您获得了+1引用计数的所有权,然后对其执行autorelease
,您将放弃对引用计数的所有权。因此,您不应再使用name
,并且不能保证指向有效对象。你返回它,指向一个可能无效的对象的指针。return @"Name";
。 @"Name"
是字符串文字,字符串文字存储在程序的整个生命周期中存在的静态存储中。这意味着这些字符串对象不受内存管理 - retain
,release
对它们没有影响。你对[[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!