NSString崩溃程序,如何修复?

时间:2012-03-18 15:57:55

标签: iphone objective-c ios cocoa

我有以下代码:

·H

NSString *mainString;

的.m

case 0: 
case 1:
case 2:
if ([typeTo textAlignment] == UITextAlignmentRight) {
     typeTo.text = [NSString stringWithFormat:@""];
     mainString = @"";
     [typeTo setTextAlignment:UITextAlignmentLeft];
     typeTo.text = [NSString stringWithFormat:@"%@%d", typeTo.text, [sender tag]];
     mainString = [NSString stringWithFormat:@"%@%d", mainString, [sender tag]];
} else {
     typeTo.text = [NSString stringWithFormat:@"%@%d", typeTo.text, [sender tag]];
     mainString = [NSString stringWithFormat:@"%@%d", mainString, [sender tag]];
}
NSLog(@"%@",mainString);
break;

通常在这条线上崩溃。

mainString = [NSString stringWithFormat:@"%@%d", mainString, [sender tag]];

代码工作然后崩溃。 typeTo.textmainString都以@""开头 文本对齐从左开始。 我做错了什么?

1 个答案:

答案 0 :(得分:2)

如果您不使用ARC,则需要保留创建的字符串或使用alloc创建它。所以:

mainString = [[NSString stringWithFormat:@"%@%d", mainString, [sender tag]] retain];

或更好:

mainString = [[NSString alloc] initWithFormat:@"%@%d", mainString, [sender tag]];

这当然意味着您在分配新值之前还需要release

崩溃的原因可能是因为您将自动释放实例分配给指针,然后该对象被自动释放但指针仍然指向该现在已死的对象。

另一种方法是使用包含retaincopy关键字的媒体资源。对于字符串,copy通常是更好的解决方案,因为您可能会意外传递NSMutableString,然后再修改它。

编辑以回答评论:

在这种情况下,为避免内存泄漏,应执行以下操作:

[mainString autorelease];
mainString = [[NSString alloc] initWithFormat:@"%@%d", mainString, [sender tag]];

这是必要的原因是因为mainString被用作创建新对象的参数,然后将其分配给mainString。因此,在initWithFormat:行之前,mainString指向字符串对象 A 。在该行之后,它现在指向一个新的字符串对象 B 。但是你需要确保清理 A ,这就是自动释放是必要的原因。如果你没有内存泄漏,最终你的应用程序将耗尽内存。

或者,您也可以这样做:

NSString *tmp = mainString;
mainString = [[NSString alloc] initWithFormat:@"%@%d", tmp, [sender tag]];
[tmp release];

区别在于autorelease说:我需要这个对象一段时间,但是在我离开这个方法后的某个时候,如果可能的话,必须清理它。 {{1} }说:我不再需要这个对象,请尽可能清理它。