2008-12-30 155 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