2009-08-18 43 views
1

當我收到內存警告時,我釋放了一堆存儲在NSMutableArray中的對象。當釋放NSArray時將對象設置爲零

[_children release]; 

我還需要在某一時刻(mem中警告發生後可能)通過對象遞歸,所以我需要檢查,如果對象是仍然存在,這是我用的比較做nil-這ISN」因爲釋放數組並不是零。

我可以通過陣列移除對象1乘1和因爲我不能迭代期間修改的陣列設置爲nil,不循環。

這感覺就像我失去了一些明顯的東西。我只想釋放+無數組中的某些值。

回答

5

很抱歉,但你在做什麼,似乎毫無意義的我。您不能將對象設置爲零,您只能將對象的引用設置爲零,但對其他引用有影響。

NSObject * a = [[NSObject alloc] init]; 
NSObject * b = a; 

[a release]; 
a = nil; 

// b is NOT nil! b still points to the memory location where 
// a used to be, which is now not valid anymore and using b 
// for anything may crash your application! 

如果我把「一」到一個數組,然後從該陣列再次刪除它,的「a」被減一保留計數。要麼它仍然大於零,在這種情況下,「a」不會被釋放,或者它是零,在這種情況下它會被釋放。將它的引用設置爲零後,對其他變量仍然指向「a」沒有影響。

因此,即使NSArray在將其刪除到數組並釋放它(因爲它的引用計數爲零)時將「a」的引用設置爲nil,它仍不會影響仍指向「a」的實例變量」。

我真的不知道你正在嘗試做的,它肯定是可能的,但你是一個完全錯誤的軌道在這裏。

+0

感謝您的澄清。我*在錯誤的軌道上,並找到了解決方法。我來自C++的背景,所以這不是很明顯。在你的例子中,我假設b == nil – Sam 2009-08-18 12:22:59

+1

由於我不知道你在做什麼,我不能提出更好的解決方案。如果數組中的對象是您自己的類,那麼您當然可以重寫dealloc方法(在保留計數達到零時調用此方法),並通知其他對象(例如代理或只是廣播通知)您現在將死亡其他對象可以將它們的引用更新爲零。 – Mecki 2009-08-18 12:59:33

+0

即使在C++中,如果您有一個指向對象的指針,當對象本身被銷燬時,您所持有的地址將不會被清除 - 當保留計數降至0時,您將擁有一個無效指針,就像Objective-C一樣;你仍然有一個參考指向內存曾經分配的位置...... – 2009-08-18 15:56:06

0

假設你沒有被從陣列中除去的對象,或釋放該數組本身你也釋放所述元件(多個)保持所述陣列元件別處,肯定。我認爲這和你需要做的一樣多。

從Apple文檔:

每個對象接收之前其ID被添加到陣列 並且當 從陣列中移除或當 陣列被釋放的釋放消息的保留消息

+0

但我怎麼知道它已經發布?我不能查詢它,因爲它不存在,它使我留下一個懸掛指針... – Sam 2009-08-18 11:20:54

+0

因爲Apple API這樣說。它說,如果你從數組中移除一個對象,或者釋放數組 - 數組對象將被釋放。 – teabot 2009-08-18 11:46:51

+0

您誤會了 - 我無法在運行時執行(appleAPISaysThisObjectIsReleasedOrNot())。我發現了一個解決方法,所以非常感謝。 – Sam 2009-08-18 12:28:23

相關問題