2012-03-18 81 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