2011-06-19 32 views
8

我想用[myarray removeallobjects]清空一個NSMutableArray;但我得到錯誤exc_bad_access。這是清空數組的正確方法嗎?我試圖將它設置爲零,但它也不工作。 其實我正在做的是用數據填充數組,並且用戶可以選擇「刷新」數據,並且我想在輸入刷新的數據之前清空數組。 我不能發佈任何代碼,因爲太大了。如何正確地清空一個NSMutableArray

+0

您可以添加將對象添加到數組的部分嗎? –

+0

[checkinArray addObject:checkinsA]; [checkinsA.taggedID release]; [checkinsA.taggedName release]; [checkinsA release]; 其中checkinsA是一個自定義對象。此命令也處於循環狀態。 – BlackM

回答

57

-[NSMutableArray removeAllObjects]是排空NSMutableArray的正確方法。你很有可能會崩潰,因爲你仍然在用戶界面中使用你刪除的對象。

+0

或者添加到數組後,對象被過度釋放。 –

0

由於您的數組在內存中不再存在,因此發生崩潰。

我敢打賭,那是因爲你忘了把它保留下來(或者它也即將發佈)您alloc + init

你可能使用[NSMutableArray array]arrayWithObjects:或其中的一些變種,或者叫autorelease創造了它,而如果它是一個實例變量,您應該保留它,直到objet被解除分配。

請注意,memory mgmt是iOS開發的關鍵部分。一定要在進一步瞭解之前完美地瞭解它(比如它變得自然,你會毫不猶豫地保留什麼時候發佈),一旦你正確使用它,它會避免你很多麻煩。

+0

@property(nonatomic,retain)NSMutableArray * checkinArray;在我的.h。 checkinArray = [[NSMutableArray alloc] init];在viewdidload和[checkinArray release]中;在dealloc中(最後一個不是問題,因爲即使我從dealloc中刪除了這一行也會崩潰)。你看到有什麼問題嗎? – BlackM

1

我認爲這個問題是在這個片段中,你已經在評論中提供的代碼,

[checkinArray addObject:checkinsA]; 
[checkinsA.taggedID release]; 
[checkinsA.taggedName release]; 
[checkinsA release]; 

taggedIDtaggedNamecheckinsA對象的屬性。他們應該只在dealloc方法中發佈。該數組不保留對象樹。它僅保留根對象。所以這裏不應該有一個版本。所以敲出中間的兩條線,並使其成爲

[checkinArray addObject:checkinsA]; 
[checkinsA release]; 
+0

checkinsA.taggedID和taggedName是checkinsA中的NSMutableArrays。 checkinsA也在for循環中。 – BlackM

+0

for(NSDictionary * user in user){ Checkin * checkinsA = [[Checkin alloc] init]; checkinsA.taggedName = [[NSMutableArray alloc] init]; checkinsA.taggedID = [[NSMutableArray alloc] init]; ...... [checkinArray addObject:checkinsA]; [checkinsA.taggedID release]; [checkinsA.taggedName release]; [checkinsA release]; – BlackM

相關問題