我已经创建了自动释放池。 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);
}
答案 0 :(得分:4)
字符串(NSString
实例和静态分配的字符串@""
)在Cocoa中是不可变的,因此当您尝试从静态分配的NSString
创建新NSString
时,{{1 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
行崩溃。
答案 1 :(得分:0)
如果你已经尝试过NSString
以外的任何类(任何自定义类),那么它就不会活着..