2011-09-11 87 views
0

在我的應用程序中,我在我的h文件中定義了一些屬性。要釋放哪些屬性,哪些不是?

據我所知,如果在m文件中有某個屬性獲取「alloc」的某個位置,我應該在dealloc方法中釋放它(或之前,如果它不再相關)。

我不清楚有關不獲取屬性「黃金」:

  • 的NSString - 我應該釋放他們(我讀職位,說「是」和職位,說「不」 )
  • 的NSDictionary/NSArray的 - 當我創建它們,我不使用 「黃金」,但一些arrayWith或dictionaryWith方法;他們是否獲得需要發佈的內存分配,還是我可以假設XCode正在關注他們的數據管理?
  • BOOL - 只是想確認我並不需要釋放他們
  • INT - 只是想確認我並不需要釋放他們
  • UI項(喜歡的UIButton ,UILabel等) - 這些項目是在IB連接的,我沒有從代碼內的「alloc」 - 是IB發佈它們,還是我應該自己做?
  • 屬性爲屬性如何影響內存管理要求?複製/保留/分配/非原子(我明白,當我做「複製」我創建另一個副本,因此supposably分配更多的內存,但我看到的示例代碼,在某些情況下釋放複製屬性,並在某些情況下不)

我不介意閱讀另一個教程(在大多數情況下,當我問一個關於內存管理的問題時,我讓人們給我發送鏈接到Apple內存管理指南),但是如果有人能解釋它或者可以直接以一個更鮮豔/清晰的教程比蘋果提出的一個我非常感謝它。

回答

1

@"some string"autoreleased。不要擔心這些。當你將它傳遞給對象時,如viewController.title = @"some string";,字符串將被其他對象保留和管理。

有兩種方法可以創建NSSet s,NSArray s或NSDictionary s。
您可以使用allocinit並稍後使用release,也可以使用返回autoreleased對象的方法+arrayWith...

不要擔心基本數據類型,如BOOL S或int秒。

特性,這retain值是性質,基本上他們確保對象保持在內存中,直到他們再次release它。您大多使用retain作爲任何類型的對象,但請注意retain cycles

1

有很多答案在那裏爲這個問題,因爲你說你讀了內存管理教程,但我猜你正在尋找的是一個很好的例子得到它在你頭腦清醒。

我對Cocoa內存管理的最有幫助的解釋是在Hillegass的書(Mac OS X的可可編程)中,他描述了一個物體就像狗一樣。每次使用增加保留計數的方法之一(new,copy,retain,init幾個我一定會忘記的,這些都在你已經閱讀的內存管理指南中),然後你正在把另一個導致狗的脖子

我現在將這個完美的比喻變成愚蠢的極端。你要求一個生動的例子!

  • 你必須採取任何的導致關閉,一旦你用它做狗。否則,你會像駕駛在國家諷刺的度假那樣,把它綁在你的車上,這不好 - 這是一個內存泄漏

  • 如果你對狗沒有領先優勢,你不能保證它會在那裏,當你想要它做一個伎倆。這可能是發送消息給發佈的對象

  • 如果你去掉狗的尾巴,並且沒有線索,那麼這隻狗可能可怕地野蠻的你,因爲你過度釋放它。

所以,從本質上講,如果你已經在狗的領先,你必須把它關掉。如果你還沒有(即你沒有叫newretain等),那麼你不這樣做。這適用於所有對象。 BOOLint不是對象,所以你不必擔心它們。

沒有狗在我的日常編程活動中受到傷害