2010-11-19 83 views
0

我有一個NSMutableArray我試圖在異步調用後重新加載。第一次加載像這樣:iOS - 重置NSMutable Array導致崩潰

self.sessionProcList = [NSMutableArray arrayWithArray:[result records]]; 

在用戶做了一些交互之後,將會到達重載NSMutableArray的同一行。這導致崩潰

頭文件有:

@interface... 
NSMutableArray *sessionProcList; 
... } 

@property (nonatomic, retain) NSMutableArray *sessionProcList; 
+1

什麼是崩潰? – 2010-11-19 04:50:25

+0

你確定在這種情況下應該使用非原子嗎? – 2010-11-19 05:00:04

+0

老實說,我不確定。我一直在尋找一個很好的例子,重用NSMutableArray並重新設置操作之間的值w /沒有運氣。這是一個非常簡單的屏幕。只需重新加載數組值。 什麼是最簡單的方法來聲明?而不是我正在使用的方法。我的方法對於同步單例很好,但似乎不適用於單個接口類。 – 2010-11-19 05:17:56

回答

0

如果我猜的話,我會說,該數組中元素被從其他地方引用。重置數組會導致使用引用的項目崩潰。

我會檢查您的應用程序的其他變量,屬性或UI元素使用這些變量,尚未釋放之前重置它。

+0

謝謝jocull!我想我可能並沒有完全找到釋放它的地方。我對這些數組中的項目有幾種類型的調用。 ZKSObject * tmpSessionProc = [self.sessionProcList objectAtIndex:indexPath.row]; 如果我釋放,我得到一個「發送到釋放實例的消息」崩潰。我錯過了什麼?再次感謝! – 2010-11-19 05:07:07

+0

我不認爲你需要釋放* tmpSessionProc因爲你沒有的Alloc變量存在。它是從self.sessionProcList引用的,所以如果你在* t​​mpSessionProc中釋放它,你也可以在self.sessionProcList中釋放它。您可以嘗試使用XCode中的開發人員控制檯(如NSLog(「Retain count:%i」,[tmpSessionProc retainCount]))進行一些調試。 – jocull 2010-11-19 05:50:44

1

說你做:

NSMutableArray *a = [NSMutableArray arrayWithObject: [[NSObject alloc] init]]; 
NSObject *o = [a objectAtIndex: 0]; 
[a removeAllObjects]; 
[o description]; // *BOOM* 

上面會[一般 - 有時沒有,但只有巧合]崩潰,因爲o已釋放由被調用的方法description的時間。

如果您有一個對數組中的對象的引用,但沒有保留所述引用,那麼當您清空數組時,可能會從您之下釋放所述對象。

(和nonatomic與原子是無關的。)

+0

[[NSObject alloc] init]是否導致保留? – joshpaul 2010-11-22 15:29:23

0

由於arrayWithArray是一個方便的方法它被用一個自動釋放標誌初始化。

你還沒有提到崩潰/錯誤消息是什麼,但我猜你的NSMutableArray在你的第二次迭代開始之前就已經發布了。

嘗試並保留數組不過多久,你需要它:

self.sessionProcList = [NSMutableArray arrayWithArray:[result records]]; 
[sessionProcList retain]; 

,然後釋放它,當你用它做:

[sessionProcList release]; 

我希望它能幫助。 Rog

+0

如果您使用屬性,這是一個保留屬性,您不需要再保留它。這不是導致崩潰的問題。 – JeremyP 2010-11-19 15:19:07