2011-05-31 172 views
3

我使用一個單獨的類的實例共享的功能,做我需要做的對象上的retain?我見過一些例子做到這一點:AVAudioSession *session = [[ AVAudioSession sharedInstance] retain];而少數簡單地做:AVAudioSession *session = [ AVAudioSession sharedInstance];。我確信有一個規則應該告訴我該怎麼做,但我不知道。的iOS:保留一個共享實例

回答

4

你說得對,有rules that tell you what to do。它們與Cocoa Touch中其他地方使用的規則相同。一個單身的客戶不應該關心他們正在使用的對象是單身,他們絕對不應該依靠單的單內斯避免了通常的內存管理公約。

是的,如果你知道一個對象是單身,你知道它不會被釋放,保留它似乎是多餘的。另一方面,當你獲得它時保留單例,當你做得更好的時候釋放單例,這就證明了程序員的意圖,並避免了向任何人(包括未來)解釋爲什麼不保留這個特定對象。最重要的是,它可以防止代碼依賴於代碼的其他部分的實現細節。

7

簡單地把它當作好像它是任何其他對象。有時單例類會覆蓋內存管理方法,以確保它不會被釋放,但是無法知道共享對象是否具有此功能。有了共享對象和單例,如果第一個被釋放,將根據需要創建一個新對象。因此,如果您需要確保指針在將來的方法中有效,請在獲取它時保留該共享對象。如果你不需要保留它,你不需要做任何事情,因爲sharedInstance方法會自動釋放它。

1

你do'nt需要,因爲它作爲單實施保留sharedInstances

+0

Jhaliya是點這裏。沒有必要保留,因爲singleton通常有一個模式等同於在sharedInstance中執行此操作:static myStaticInstance = [[MyClass alloc] init]; – pho0 2011-05-31 03:48:16

+1

調用代碼不應該對班級如何管理其內存做出假設。一個類可能會呈現一個類似單例的界面,但實際上在某些時候實際上會給你一個新的實例。如果你在這種情況下依靠單身人士,你最終會得到一個懸掛指針。 @ pho0 – 2011-05-31 18:48:33