2012-04-27 106 views
0

我在調用NSMutableArray上的removeObjectAtIndex時發生異常,並且說myLocationsArray被聲明爲不可變,從而導致應用程序拋出異常。該陣列上的所有其他操作都很好,最明確的聲明是正確的,等等,但在我的應用程序中,它被設置爲不可變的。在removeObjectAtIndex呼叫前右將NSMutableArray重新初始化爲NSMutableArray

myLocationsArray = [[NSMutableArray alloc] initWithArray:[defaults 
objectForKey:MYLOCATIONSARRAY_KEY]]; 

:調查的試圖找到在哪裏獲得設置不變一段時間後,我決定擰緊,只是重新聲明變量本身。

但是我知道這是壞的,我在相同的變量上調用alloc/init兩次。但它是唯一有效的工作。有沒有什麼辦法提醒這個變量,它是一個NSMutableArray,而不像我這樣引入內存泄漏?

+1

您需要顯示一些代碼,與陣列涉及並可能導致這一點,否則任何人都很難提供適當的建議。 – 2012-04-27 16:07:49

回答

1

NSUserDefaults返回數組的不可變副本。無論你把NSArray還是NSMutableArray都放在裏面,它總是給你不可變的拷貝。

那麼,這樣做是爲了得到一個可變的副本,您可以用

myLocationsArray = [[NSMutableArray alloc] initWithArray:[[[defaults objectForKey:MYLOCATIONSARRAY_KEY] mutableCopy] autorelease]]; 

或者就是這樣工作

myLocationsArray = [[defaults objectForKey:MYLOCATIONSARRAY_KEY] mutableCopy]; 
+0

我終於意識到問題是NSUserDefaults返回不可變的NSArrays,但我重新聲明他們NSMutableArrays來解決它,沒有意識到我可以告訴它給我一個可變的副本:-D – jamzsabb 2012-04-28 16:58:40

0

該聲明不應該;你的錯誤是一個運行時錯誤。這聽起來像你的myLocationsArray變量已經被分配了一個不可變數組(NSArray),不管它是在某個地方被重新分配,還是總是不可變的,都不可能從你的代碼片段中說出來。

1

我會建議在程序拋出異常的行(包含removeObjectAtIndex的行)上設置一個斷點,並用調試器檢查數組的實際類型。如果您將鼠標懸停在數組名稱上,則會顯示一個彈出式菜單,爲您提供有關指向對象所需的所有信息。

我期望的是,你發現這種方式,該對象是一個NSArray(與NSMutableArray),然後追溯到初始化它的位置。

1

看起來您正在使用NSUserDefaults。不管你存入什麼東西,你從NSUserDefaults得到的所有對象總是不變的。 NSUserDefaults不保留對您設置的特定對象的引用,它會保留數據。它有效地製作副本。當你從NSUserDefaults中得到某些東西時,它會根據它存儲的數據創建一個新的(不可變的)對象,並將它提供給您。

不出所料,您不能通過改變您(認爲您)存儲在其中的內容來更改存儲在NSUserDefaults中的內容。只能通過重新存儲某些內容來替換之前存儲的內容,從而更改所存儲的內容。

+0

是的,它原來是NSUserDefaults。我確定在將NSUserDefaults中的數據blob分配給它之前聲明我的NSMutableArray,並修復它並允許隨意更改。謝謝! – jamzsabb 2012-04-28 16:12:21