2010-04-27 121 views
2

我在兩個類之間實現了委託回調模式,而不保留委託。但在某些情況下,代表處是交易的。回調處理委託時處理?

(我的情況是,我有一個視圖控制器是委託對象,並且當用戶按下後退按鈕彈出該視圖控制器出NavigationController棧)

然後回調方法得到BAD_EXE:

if (self.delegate != nil && [self.delegate respondsToSelector:selector]) { 
    [self.delegate performSelector:selector withObject:self withObject:returnObject]; 
} 

我知道委託回調模式是在很多應用程序中實現的。你有什麼解決方案?

+0

有人說我們無法測試正在處理的對象實例: http://stackoverflow.com/questions/983333/objective-c-test-for-object-instance-being-dealloced-freed – KONG 2010-04-27 09:55:31

回答

2

通常,委託人應始終將其與其委託對象取消關聯,其方法爲dealloc。所以你的視圖控制器應該檢查它的dealloc它是否被設置爲委派類的委託,如果是這樣,請將委託屬性設置爲nil

在大多數情況下,我會想象這不會是一個問題,因爲委託人常常是委託對象的唯一所有者。所以當委託被取消分配時,委託對象也會被釋放。畢竟,這是委託對象通常只對其代表提供弱引用的原因。

+0

我試試遵循NSURLConnection實現委託 - 回調的方式。使用這個我不必保留委託對象。 A類: Initalize NetworkClass,稱它執行任務 NetworkClass * networkObject = [[NetworkClass alloc] init]; [networkObject getSomethingWithDelegate:self]; callbacking當,NetworkClass其傳遞自於ClassA的 釋放 - (無效)networkClass:(NetworkClass *)networkObject didGetSomething:(NSObject的*)返回object { 與返回object [networkObject釋放] //做; networkObject = nil; } 但我可能不得不改變這一點,就像你說的那樣。 – KONG 2010-04-27 10:31:28

+0

我想釋放委託對象時釋放委託對象。但是,在某些庫中,例如MGTwitterEngine,NSURLConnection,委託對象保留自身,然後我無法釋放委託對象。你有什麼主意嗎? – KONG 2010-04-28 03:34:34

+0

我說你應該把委託屬性設置爲零(在某些情況下),而不是你應該釋放任何東西。你絕不能釋放你不擁有的物體。我真的不明白你的問題。 – 2010-04-28 08:59:47

0

我沒有Objective-C的知識,但我認爲你需要測試self.delegate != nil分別e.g

if (self.delegate != nil) 
{ 
if ([self.delegate respondsToSelector:selector]) 
{ 
    [self.delegate performSelector:selector withObject:self withObject:returnObject]; 
} 
} 

哦,這是最好的重新分配委託,如果它是零。

+0

不,這不會幫助。 'delegate'屬性仍然會指向一個內存地址,但該地址處的對象已被釋放。如果代表是「無」的,那就不會有問題。 – 2010-04-27 09:55:39

+0

好的。只是想知道,在測試「零」或「空」值以及檢查它可以具有其他值會導致問題之前,我遇到了問題。從你說的話我認爲這不是Objective-C的問題。 我知道OP說過這個代表已經被釋放,但現在我發現情況並非總是如此。 – ChrisBD 2010-04-27 10:28:25

+0

如果&&檢查中的第一條語句失敗,則不會評估第二條語句。 – quantumpotato 2011-12-29 21:28:34