iphone - NSString 崩溃程序,如何修复?

标签 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 都以 @"" 开头 文本对齐从左开始。 我做错了什么?

最佳答案

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

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

或者更好:

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

这当然意味着您还需要在分配新值之前释放它。

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

另一种方法是使用带有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 说:我暂时需要这个对象,但是在我离开这个方法一段时间后,如果可能的话必须清理它。 release 说:我不再需要该对象,如果可能,请立即清理它。

关于iphone - NSString 崩溃程序,如何修复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9759751/

相关文章:

iphone - 从 Exif 数据计算照度

iphone - 如何在 iOS 7 音频中断后恢复 Audio Session ?

iphone - 按下取消时显示警报 View 并保持在同一 View Controller 上

ios - Xcode 内存图调试图标未显示

ios - 是否可以在 "number"输入 angularjs 中允许空格

iphone - 要在 iPhone 上显示的 URL 上的文本文件的内容

iphone - 使用AudioToolKit的简单音效循环

ios - 从 objC 访问 swift 属性

objective-c - UIViewController 的子类显示黑屏

ios - swift iOS : Inserting data into Firebase database overwrites existing data