我有以下代码:
.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.text
和mainString
都是从@""
开始的文本对齐方式从左开始。我做错了什么?
如果不使用 ARC,则需要保留创建的字符串或使用 alloc
创建它。因此,请执行以下任一操作:
mainString = [[NSString stringWithFormat:@"%@%d", mainString, [sender tag]] retain];
或者更好的是:
mainString = [[NSString alloc] initWithFormat:@"%@%d", mainString, [sender tag]];
这当然意味着您还需要在分配新值之前release
它。
崩溃的原因可能是因为您将自动释放实例分配给指针,然后对象被自动释放,但指针仍然指向该现已失效的对象。
另一种方法是使用带有 retain
或 copy
关键字的属性。对于字符串,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
说:我需要这个对象一小段时间,但是在我离开此方法后的一段时间内,如果可能的话,必须清理它。 release
说:我不再需要这个东西了,如果可能的话,请现在清理它。