我已经创建了自动释放池。 localString 已添加到此池中。我释放了游泳池。 localString 和 string 必须被释放。但实际上他们还活着。你可以看到我的日志:
Why is the string object still alive? I don't know.
和代码:
-(NSString*) happyString
{
NSString *localString = [[[NSString alloc] initWithString:@"I don't know."] autorelease];
return localString;
}
-(IBAction) onButton:(id)sender
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSString *string = [self happyString];
[pool release];
NSLog(@"Why is the string object still alive? %@", string);
}
最佳答案
字符串( NSString
实例和带有 @""
的静态分配字符串)在 Cocoa 中是不可变的,因此当您尝试创建新的 NSString
时从静态分配的 NSString
class 可以做一个优化:一个新的 NSString
未创建实例(调用 -alloc
时创建的对象会立即释放),并且返回对静态分配的字符串的引用。也就是说,该行:
NSString *localString = [[[NSString alloc] initWithString:@"I don't know."] autorelease];
实际上相当于:
NSString *localString = @"I don't know.";
(如果你检查这两个对象的内存地址,你会发现它们是一样的。)
由于这种类型的字符串无法释放,因此它不会在您期望的时候消失。
如果您要以无法优化的方式创建字符串,例如:
NSString *localString = [[[NSString alloc] initWithFormat:@"%@", @"I don't know."] autorelease];
然后您的代码将按照您的预期运行,您的应用程序将(希望)在您的
NSLog
处崩溃。线。
关于ios - 为什么自动释放对象还活着?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9078198/