2013-08-04 69 views
0

在我的應用程序委託中,我有一個對象,我需要在一些不同的3個viewControllers中使用。 要使用它,我做的界面Objective-c某些viewController中使用的委託必須被釋放?

NewsPadAppDelegateiPad *delegate; 

,並在執行我做

delegate = (NewsPadAppDelegateiPad *)[[UIApplication sharedApplication] delegate]; 
[delegate.reader setDelegate:self]; 
.... 
[delegate.reader doSomthing]; 

當在我的dealloc方法我做

[delegate release]; 
delegate=nil; 

我收到錯誤

[CFString release]: message sent to deallocated instance 0x9d4fac0 

我真的需要釋放那個?

+0

您不應該保留並釋放您的應用程序委託。它由應用程序創建,並會在沒有您的幫助的情況下保留到應用程序的末尾。事實上,在您的視圖控制器中沒有真正的需要使用委託變量 - 您可以在需要時重新獲取委託指針,也可以將其保存在給定方法的局部變量中,但不能保存實例變量。 –

回答

0

根據Cocoa's memory management name convention,您不擁有該對象,因此您不會釋放它。當它超出範圍時它會被釋放。

+0

我的代碼是否創建了我的委託的新實例,或者它只是一個指針?我不想浪費內存;) –

+0

@UsiUsi它只是一個指針。 –

1

一般而言,您不應該保留您的代表:這可以讓您避免保留循環 - 兩個或多個對象在循環中互相保留,防止整個組被釋放的情況。

這看起來是一個ARC預代碼,因此您應該避免保留並釋放委託。

在ARC代碼中,您應該聲明代理__weak,除非您有特定的理由使用強引用(具體而言,當您想要擁有委託對象時保留委託;這非常罕見 - 事實上,通常是其他周圍)。

這是good discussion of the topic on why delegates are not usually retained

+0

請注意,這個特定的情況是「應用程序委託」,它是在應用程序啓動並持續到最後時由UIApplication創建的。實際上,它是一個「單身人士」。 –

+0

@HotLicks我認爲[另一個例外是'CAAnimation'](http://developer.apple.com/library/ios/#DOCUMENTATION/GraphicsImaging/Reference/CAAnimation_class/Introduction/Introduction.html)和模態代表。 – dasblinkenlight

相關問題