2012-08-05 41 views
1

我有以下代碼:釋放對象 - 失去價值

NSString *Items[91]; 

在所有上述方法.m文件作爲全局數組這在我的init方法我做的:

for (j1 = 0; j1 <= 90; j1++) 
    { 
     Items[j1] = [[NSString alloc] initWithFormat:@""]; 
    } 

在某些時候不同的方法AA被觸發,這樣做:

Items[40] = [NSString stringWithFormat:@"40. Pers:%g each", PersExemptions]; 
Items[41] [email protected]"blah blah"; 

...等

並且在某些時候觸發了一個不同的方法BB,並且我看到對於釋放對象的項目[40],它失去了它所具有的破壞目的的價值。格兒。

我想Items數組通過應用程序保持它們的修改值直到結束,我認爲使用init方法中使用的initWithFormat應該照顧它。 我明白,項目是C風格的數組(並轉換爲NSMutable陣列會痛苦),如果這是開始的問題。

我欣賞這方面的任何幫助。

+0

您顯示的代碼不足以證明問題(也就是說,您所顯示的內容沒有任何問題)。這個問題可能存在於其他地方,在某些代碼中,這些代碼正在摧毀'Items [40]'值。 – 2012-08-05 01:49:31

+0

你可能再看一次,@GregHewgill,問題肯定在這裏。 – 2012-08-05 01:52:06

+1

我可能錯過了一些東西。請告訴我我錯了! – 2012-08-05 01:54:30

回答

3

編輯:作爲@dasblinkenlight指出,我假設你在這裏沒有使用ARC。

你在這裏使用的是C風格的數組,這是一個NSString *數組。

的問題是,當你這樣做......

[NSString stringWithFormat:@"40. Pers:%g each", PersExemptions]

stringWithFormat:返回你沒有自己一個NSString。如果你想保持你的數組中的NSString,你需要保留它。或者,您可以使用您前面所做的分配/ initWithString:

Items[40] = [[NSString alloc] initWithFormat:@"40. Pers:%g each", PersExemptions];

這就給了你一個NSString你自己。但是,當然,這會導致另一個bug,就是剛剛泄漏了NSString在Items [40]中發生的任何事情。

因此,您可以確保每次都釋放前一個字符串,或者您可以節省很多精力,而只需使用NSMutableArray。 NSMutableArray將負責保留每個新值並釋放剛剛替換的值。我知道你說這太費勁了,沒有看過你的代碼,沒有其他人可以說,但考慮你存儲的每個對象實際上可能是更多的努力。

我希望有幫助。

+2

你認爲它不是* ARC,對吧? – dasblinkenlight 2012-08-05 02:12:42

+0

@dasblinkenlight是的,對,我應該這樣說。謝謝。 – 2012-08-05 02:15:12

+0

@Firoze Lafeer謝謝你的解釋,它有助於理解我在這裏理所當然的內在工作。我打算將C樣式數組轉換爲NSMutableArray。至於ARC,我不知道該如何啓用它或好處,所以我會做一些適當的處理。 – 2012-08-05 16:12:09

0

現在的NSString是:

NSString ** strArr; 
int rows = 91; 

然後,你需要使用malloc,動態分配內存:

int i; 
strArr = malloc(rows * sizeof(strArr *)); 

for(i = 0; i < rows; i++) 
{ 
strArr[ i ] = calloc(columns, sizeof(NSString)); 
} 

不要忘了在你的dealloc方法來釋放:

int i; 

for(i = 0; i < rows; i++) 
{ 
    free(strArr[ i ]); 
} 
free(strArr); 
+0

感謝您的回覆,我想我會使用NSMutablearrays,因爲它似乎與objectice-c更好地集成在一起。 – 2012-08-05 16:15:00