在if()语句之外启动NSString,将其分配到内部并在之后释放会导致崩溃

时间:2010-08-11 17:45:35

标签: objective-c nsstring

坚持释放我正在创建的所有内容的规则,为什么行[cellText release]会崩溃我的应用?它必须是真的简单的东西,我对iPhone应用程序开发者来说还是新手。

...

  NSMutableString *cellText = [[NSMutableString alloc] initWithString:@""];

  // the cell is a section cell
  if (/* some condition */) {    
    cellText = @"some text";
  }

  // why does this make the app crash?!  
  [cellText release];

...

2 个答案:

答案 0 :(得分:1)

问题在于您实际上是在尝试释放另一个对象,而不是您创建的对象。

cellText = @"some text";行上,您将指针指向另一个对象。

你可以尝试这样的事情

NSMutableString *cellText = nil; // make sure that the pointer is initialized with nil

// the cell is a section cell
if (/* some condition */) {    
    cellText = [[NSString alloc] initWithString:@"some text"];
}

// now you can release it (if it's nil, no problem, because sending a message to nil has no effect) 
[cellText release];

答案 1 :(得分:0)

cellText是对象的指针。分配给它时,分配指针而不是在对象内分配。所以通过做

cellText = @"some text";

您忘记了原始指针并记录了指向常量字符串@"some text"的指针。当你尝试release时会导致错误,因为它不是你分配的对象,它是一个常量。 (虽然我认为你应该能够将release发送到一个常量字符串,但它应该什么也不做,所以如果崩溃可能有点奇怪。)

与此同时,您的原始字符串永远不会被释放,因为您不再有指向它的指针以发送消息。