2013-06-05 33 views
0

我有一些問題,將NSArray轉換爲NSString。NSArray到NSString ....一些崩潰發生

這是代碼。

- (void)createStringWithArray:(NSArray *)arr_1 andTheOtherArray:(NSArray *)are_2 
{ 
    NSString *outputString = @"Start"; 

    if (arr_1) { 
     for (Object *object in arr_1) { 
      outputString = [outputString stringByAppendingFormat:@"\n(%f, %f)", object.value1, object.value2]; 
     } 
     outputString = [outputString stringByAppendingFormat:@"\nArray 1 End"]; 
    } 
    if (arr_2) { 
     for (Object *object in arr_2) { 
      outputString = [outputString stringByAppendingFormat:@"\n(%f, %f)", object.value1, object.value2]; 
     } 
     outputString = [outputString stringByAppendingFormat:@"\nArray 2 End"]; 
    } 

    NSLog(@"%@", outputString); 
} 

每個are_1和are_2中有48個對象和1568個對象。

我無法找到iPhone模擬器 的任何問題,但應用程序在iPad mini和iPhone5設備上沒有日誌時崩潰。 它發生在第二個循環函數上。

我想必須有內存問題,但我不知道究竟是什麼錯誤。

請幫忙。

+0

爲所有異常添加一個異常斷點用於斷點拋出。將您的設備連接到您的計算機並通過XCode啓動應用程序。告訴我們:崩潰時的堆棧跟蹤,在控制檯上輸出。 – Mar0ux

+1

在你的參數中有are_2而不是arr_2 – TomCobo

+0

如果你沒有日誌,你怎麼知道它發生在第二個循環? – trojanfoe

回答

1

您應該使用NSMutableString而不是NSString。該字符串應該是可變的

- (void)createStringWithArray:(NSArray *)arr_1 andTheOtherArray:(NSArray *)arr_2 
    { 
     NSMutableString *outputString = [[NSMutableString alloc] initWithString:@"Start"]; 

     if (arr_1) { 
      for (Object *object in arr_1) { 

       [outputString appendFormat:@"\n(%f, %f)", object.value1, object.value2]; 
      } 
      [outputString appendString:@"\nArray 1 End"]; 
     } 
     if (arr_2) { 
      for (Object *object in arr_2) { 
       [outputString appendFormat:@"\n(%f, %f)", object.value1, object.value2]; 
      } 
      [outputString appendString:@"\nArray 2 End"]; 
     } 

     NSLog(@"%@", outputString); 
    } 
+0

我用同樣的方式解決了它!謝謝。 –

2

在你聲明你有兩個數組(arr_1和are_2)的方法中,但是在你使用arr_1和arr_2的IF中,即使你不執行你的代碼,編譯器也應該顯示錯誤。

+0

嗯,感謝您的幫助 –

0

您正在將botharrays分配給單個變量outputSting。將它作爲不同的變量並連接它們。還要照顧方法內傳遞的參數。

0

如果您的數組中有很多項目,那麼您可能會消耗大量內存。每次有:

outputString = [outputString stringByAppendingFormat:@"..."]; 

您正在反覆創建新字符串,但舊字符串使用的內存仍在使用中。你不能手動釋放這個內存,因爲你不擁有它,它在下次autorelease池被耗盡時被釋放,但是因爲你的方法中任何地方的池都沒有被排空,所以存在內存耗盡的風險。

這可以通過簡單地使用可變字符串來解決。

- (void)createStringWithArray:(NSArray *)arr_1 andTheOtherArray:(NSArray *)are_2 
{ 
    NSString *outputString = [NSMutableString stringWithString:@"Start"]; 

    if (arr_1) { 
     for (Object *object in arr_1) 
      [outputString appendFormat:@"\n(%f, %f)", object.value1, object.value2]; 
     [outputString appendString:@"\nArray 1 End"]; 
    } 

    if (arr_2) { 
     for (Object *object in arr_2) 
      [outputString appendFormat:@"\n(%f, %f)", object.value1, object.value2]; 
     [outputString appendString:@"\nArray 2 End"]; 
    } 

    NSLog(@"%@", outputString); 
}