1

爲了在cellForRowAtIndexPath方法中設置cell.textLabel.text,我分配並初始化一個字符串。如果我在設置cell.textLabel.text後釋放這個字符串,那麼程序會在執行幾次後崩潰。NSString不必在cellForRowAtIndexPath:方法中被釋放?

爲什麼不第一次崩潰?既然這個字符串是被分配和編輯的,是不是必須被釋放?

下面的代碼:

NSString *cellText = [[NSString alloc] init]; 
    cellText = [NSString stringWithFormat:@"(%.1f points", totalpoints]; 
    if (showNumberOfPlayers) { 
     cellText = [cellText stringByAppendingFormat:@", %i players) ", [[playerArray objectAtIndex:indexPath.row] count]]; 
    } 
    else { 
     cellText = [cellText stringByAppendingString:@") "]; 
    } 

    cell.textLabel.text = [cellText stringByAppendingString:teamList]; 
    [cellText release]; 
+0

請給出代碼 – willcodejavaforfood 2010-10-10 12:58:43

回答

4

內存管理的經典誤會。

alloccellText在代碼的第一行,但在第二行覆蓋它。所以現在你不能訪問原始對象,並且釋放自動釋放的對象,這會導致崩潰。

在if語句中,您再次覆蓋該值時也是如此。在這種情況下,我會使用正常的,自動發佈的NSString對象,但是您也可以使用自己釋放的NSMutableString(但您必須調整代碼以使用NSMutableString方法,例如appendFormat:而不是stringByAppendingFormat:

NSString *cellText = [NSString stringWithFormat:@"(%.1f points", totalpoints]; 

這個時候你永遠alloc字符串自己,所以你不必將其釋放。當你覆蓋變量時,沒有問題,因爲以前的值會被自動釋放。

相關問題