在我的下面的函数中,如果我删除了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];
}
答案 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代替它(虽然它的使用不是正确的。只是风格问题。)。