发布NSString对象时出现运行时错误

时间:2012-02-03 00:27:25

标签: cocoa

在我的下面的函数中,如果我删除了tempString release语句,它的工作正常但是有了它,总会出现运行时错误。这是一个简单的函数,它在NSTextField中显示一个数组_stackDisp1或_stackDisp2但由于某种原因释放字符串会产生运行时错误任何帮助?

- (void) displayArr:(NSMutableArray*)stack{
  NSTextField *myObj;
  if([stack count] <= 10) myObj = _stackDisp1;
  else myObj = _stackDisp2;
  NSString *tempString = [[NSString alloc]initWithString:@""];
  for(NSString *i in stack){
    tempString = [NSString stringWithFormat:@"%@\n%@",tempString,i];
  }
  [myObj setStringValue:tempString];
  [tempString release];
}

2 个答案:

答案 0 :(得分:1)

那是因为

tempString = [NSString stringWithFormat:@"%@\n%@",tempString,i];

创建一个新的自动释放对象,将其分配给变量tempString。指向第一个对象的指针会丢失,最终会过度释放自动释放的对象。只需将初始分配更改为

即可
  NSString *tempString = @"";

并删除[tempString release]行。

答案 1 :(得分:0)

在for循环中,您将tempString分配给自动释放的字符串:

tempString = [NSString stringWithFormat:@"%@\n%@",tempString,i];

手动释放它会导致BAD_ACCESS。

你也可能正在寻找这个:

- (void) displayArr:(NSMutableArray*)stack{
  NSTextField *myObj = ([stack count] <= 10) ? _stackDisp1 : _stackDisp2;
  [myObj setStringValue:[stack componentsJoinedByString:@"\n"]];
}

myObj的声明/作业对我来说有点过于冗长,
所以我使用了ternary operator代替它(虽然它的使用不是正确的。只是风格问题。)。