2009-11-11 90 views
2

這可能是一個愚蠢的問題,但我一直在思考它一段時間沒有明顯的答案。我應該分配一個NSMUtableArray實例變量嗎?

我有一個小的應用程序,我一直在努力,並與我的NSMutableArray實例變量有問題。在向viewDidLoad添加[[NSMutableArray alloc] init]之前,它總是(空)。

我對Objective C世界很新,所以我試圖理解這個問題。我的印象是,當我實例化我的類時,實例變量都被分配了。當我在沒有alloc/init的情況下將數組添加到數組時,它保留(空),保留計數爲0.

有問題的數組被聲明爲(retain)屬性。

如果不明確,我可以添加代碼。

回答

5

任何實例變量都是對象,實際上只是指針被初始化爲零(0)。這就是爲什麼該項不被保留並添加到數組中,因爲消息到零對象返回零/ 0。

您需要在您的類的init中分配並初始化對象,然後在dealloc中釋放它。

+0

所以指針被創建,但實際上沒有內存分配在實例化?如果我宣佈我的ivar爲(保留)屬性,那麼生成的setter將分配內存? – Eric 2009-11-11 16:46:09

+1

@Eric:setter爲變量分配內存是沒有意義的。您需要將有效的實例傳遞給setter,在這種情況下,內存已經被分配。語言無法神奇地知道你希望你的ivars只是因爲你聲明它們是特定類型而設置的。 – Chuck 2009-11-11 16:49:59

+0

@Chuck:我現在明白了。非常感謝您的幫助! – Eric 2009-11-11 16:54:12

2

屬性聲明中的retain/assign/copy限定符是關於如何在編譯器爲您合成的getter和setter中管理屬性值的內存。 (The documentation詳細討論了它們,並給出了每種類型的示例代碼。)

這與您的實例變量是否爲您初始化完全正交。宣佈伊娃只是爲價值儲備;對於Objective-C類,這是一個指向實例的指針。運行時初始化這些ivars爲零,但你仍然負責創建你想存儲在那裏的對象。 (在Java或C#等類似的語言中也是如此:聲明一個Array實例變量只是給你一個引用空間,它不會爲你創建數組。)

+0

當你說聲明ivar爲這個值保留空間時,你是指指針值而不是用於該對象的實際內存? – Eric 2009-11-11 16:48:15

+0

正確。伊娃只是一個指針。當你的實例被分配時,運行時會將它設置爲「nil」,除非你將它指向某個東西,否則它永遠不會有任何不同。 – 2009-11-11 19:15:54

相關問題