【问题标题】:Why is autorelease object still alive?为什么自动释放对象还活着?
【发布时间】:2012-02-23 02:13:38
【问题描述】:

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

【问题讨论】:

  • 也许retainCount不是0?也使用 [string retainCount] 记录此属性
  • @matzino 这没有任何价值——retainCount 毫无意义。
  • 顺便说一下,你应该使用[pool drain];而不是[pool release];

标签: ios memory-management autorelease


【解决方案1】:

字符串(NSString 实例和带有@"" 的静态分配字符串)在 Cocoa 中是不可变的,因此当您尝试从静态分配的字符串创建新的NSString 时,NSString 类可以进行优化:未创建新的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 行崩溃。

【讨论】:

    【解决方案2】:

    如果您尝试过除 NSString 之外的任何类(任何自定义类),那么它就不会存在..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-11
      • 2011-11-18
      • 2011-11-18
      • 2011-05-08
      • 2012-01-10
      • 2016-05-06
      • 2010-10-25
      相关资源
      最近更新 更多