2008-12-30 201 views
1

我在做這樣的事情:如何檢查代表是否有效?

@protocol CallbackDelegate 
-(void) performCallback; 
@end 

@interface MyObject : NSObject { 
    id<CallbackDelegate> delegate; 
} 

-(void)AsyncFuncCall; 

@end 

@property (nonatomic, assign) id<CallbackDelegate> *delegate; 

擁有MyObject建立一個委託接收回調函數的代碼:

MyObject *myobject = [[MyOject alloc] init]; 
myobject.delegate = x; 

然後在MyObject,作爲一個異步函數的結果打電話給我發信號給代表:

-(void)AsyncFuncCall { 
    [delegate performCallback]; 
} 

大部分時間似乎都很好,除了由於有效的內存清理,我的代理已被釋放的場合。在這種情況下,我只是想不執行回調

有誰知道檢查代理是否有效的最佳方法?

我已經試過各種東西,如:

if (delegate != nil) { 
    ... 
} 

沒有運氣。

回答

4

你代表應無出其的dealloc myObject的的委託財產,以避免這種情況:

- (void) dealloc { 
    if (myObject.delegate == self) myObject.delegate = nil; 
    [super dealloc]; 
} 

或者,但不推薦,你可以保留的委託。但是,這可能導致retain cycle

+0

輝煌,這看起來它應該也工作! 我之前留着代表來解決我遇到的問題 - 但是我的代碼看起來很雜亂,而且感覺不太對勁。 上面的解決方案看起來像解決了這個問題。 再次感謝, 尼克。 – 2008-12-30 13:43:45