2009-07-27 55 views
1

如果我們寫下面的代碼:Objective-C的代表指針

ExplorerAppDelegate * appDelegate = (ExplorerAppDelegate *)[[UIApplication sharedApplication] delegate]; 

這使得原來的委託指針引用,但:

  • 是否增加引用計數?
  • 我們是否必須在完成之後或根本不需要明確呼叫[ExplorerAppDelegate retain]
  • 究竟發生了什麼?

在我們使用這個之後,我們也應該在dealloc方法中做一個[ExplorerAppDelegate release],對吧?

回答

0
  1. 引用計數將不會增加
  2. 你應該保留它,如果你想確保它不釋放,而你有一個指向它
  3. 您應該只釋放它,如果你保留它

所以基本上,如果你只在一個函數中使用該對象,你可能不需要保留或釋放它。如果它存在,那麼它可能(可能)不會被函數的結尾釋放。例如,如果你保留它,以ivar(成員變量)爲例,那麼你應該保留它並稍後釋放它。

+0

謝謝您的回答.. :) – user145374 2009-07-27 01:49:13

+0

這一切都是有效的,並且完全正確。但是...因爲應用程序委託是在應用程序啓動時創建的,並且從未發佈(至少不會被終止),所以您可以簡單地保留引用,而不是保留引用,並且完全忽略該問題。在這種情況下,您知道引用將在應用程序的整個生命週期內保持有效。 – 2009-07-27 02:51:55

2

不,它不會增加保留計數。

Objective-C中的約定是你給出的對象應該是你自己管理的內存 - 但是在獲得像應用程序委託這樣的共享公共資源的情況下,內存在其他地方維護,當然應用程序代表),只要你的課程是......就知道它將永遠是「活着的」,所以不需要保留參考。

在委託人的大多數用途中,不是提取委託給你,而是該委託也不被保留。在這種情況下,向代理人提供的人員也可以在代理人發佈前清理代理人鏈接。

您不希望通常保留委託引用的原因是它可以防止某些對象被釋放,例如,如果一個類是將另一個類作爲委託的類的委託。