为什么自动释放对象还活着?

时间:2012-01-31 10:45:08

标签: ios memory-management autorelease

我已经创建了自动释放池。 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);  
}

2 个答案:

答案 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以外的任何类(任何自定义类),那么它就不会活着..