结果会怎样?是否有任何泄漏或崩溃?
-(NSString)returnPersonName {
NSAutorelease *pool = [[NSAutorelease alloc]init];
NSString *name = [[[NSString alloc]initWithString:@"Name"]autorelease];
[pool drain];
return name
}
让我有点困惑。
最佳答案
- 此代码违反了内存管理规则。您执行
alloc
,因此获得+1引用计数的所有权,然后对其执行autorelease
,从而放弃对引用计数的所有权。因此,您不应再使用name
,并且不能保证它指向有效的对象。您返回它,一个指向可能无效对象的指针。 - 在这种特殊情况下,由于 Cocoa 的实现细节,不会发生任何“不好”的事情。该函数的主体相当于
return @"Name";
。@"Name"
是一个字符串文字,字符串文字存储在静态存储中,该静态存储在程序的整个生命周期中都存在。这意味着这些字符串对象不受内存管理——retain
、release
对它们没有影响。您对其执行[[NSString alloc] init...]
,但NSString
的初始化器经过优化,可以简单地保留并返回其参数(如果参数已经是不可变的)字符串。所以你不会返回一个新的 NSString 对象;您只是返回相同的字符串文字,该字符串文字是静态分配的并且不受内存管理的约束。再说一次,所有这些都是 Cocoa 的实现细节,你不能依赖。
关于ios - NSAutoreleasepool 是否存在泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31676009/