2012-03-18 120 views
0

我有以下代码:NSString崩溃程序,如何解决?

.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开始为@"" 并且文字对齐从左边开始。 我在做什么错?

+0

什么是崩溃日志消息? – 2012-03-18 16:03:19

+0

这是EXC_BAD_ACCESS – 2012-03-18 16:06:06

+0

你可以分享完整的.h和.m文件 – 2012-03-18 16:07:44

回答

2

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

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

或更好:

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

这当然意味着你还需要release它分配一个新值之前。

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

另一种方法是使用retaincopy关键字的属性。对于字符串,copy通常是更好的解决方案,因为您可能会不小心通过NSMutableString,然后再修改它。

编辑回答评论:

在这种情况下,为了避免内存泄漏,下面要做到:

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

之所以这样,是因为使用了mainString作为创建一个新对象的参数,然后这个对象又被分配到mainString。所以在initWithFormat:行之前,mainString指向一个字符串对象A。在该行之后,它现在指向一个新的字符串对象B。但是你需要确保清理A,这就是为什么autorelease是必要的。如果你没有,你会有内存泄漏,最终你的应用程序将耗尽内存。

或者,你也可以这样做:

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

不同的是,autorelease说:我需要这个对象一小会儿,但过一段时间后,我离开这个方法必须如有可能被清理。release说:我不再需要这个对象,如果可能请现在清理它。

+0

感谢它的工作!它没有发布,我必须发布?因为我只是想继续添加到字符串 – 2012-03-18 16:20:06

+0

是的,你必须发布,否则你会有内存泄漏。但是,在这种情况下,您可能想像这样使用'autorelease':'[mainString autorelease]; mainString = [[NSString alloc] initWithFormat:@“%@%d”,mainString,[sender tag]];' – DarkDust 2012-03-18 16:22:26

+0

嗯,不太明白,因为它看起来没有这个工作完美 – 2012-03-18 16:27:04