iOS:如何处理已发布的委托

时间:2012-10-04 18:43:55

标签: ios delegates

我有一个对象,它充当我的视图控制器和我的webservice之间的连接层。此对象接受委托,并在从服务器返回数据时通知该委托。我遇到了一个问题,其中委托在http请求运行时被dealloc'd。当请求返回时,我的对象尝试在委托上调用方法,并且应用程序崩溃。

处理此问题的最佳方法是什么。我已经在几个地方读过你不应该保留你的代表,因为他们经常保留这个对象,导致循环依赖。因此,如果我不能保留我的委托,在调用方法之前如何检查它是否已经被解除了?

@property (nonatomic, assign) NSObject<ServerConnectionDelegate>* delegate;

2 个答案:

答案 0 :(得分:3)

如果委托的生命周期长于worker对象的生命周期,通常应该使用委托模式。 (抱歉不确定这里的正确用语)。

您有多种方法可以解决这个问题:

  • 作为一种解决方法,您可以在对象的dealloc方法中将连接委托设置为nil。
  • 如果需要数据(可能是以后的某些用法),您可以使用NSNotification通知委托任何连接事件而不是委托模式。
  • 正如杰克在评论中所说,你可以让你的代表成为一个弱连接属性 - 如果你的项目使用ARC,这可能是最好的解决方案

答案 1 :(得分:0)

您应该取消任何正在运行的请求,并在dealloc方法中将其委托设置为nil。

- (void)dealloc
{
   [yourWebServiceRequest cancelRequestAndClearDelegate]; 
   [super dealloc];
}