2

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

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

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

2 回答 2

3

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

你有几个选项来解决这个问题:

  • 作为一种解决方法,您可以在对象的 dealloc 方法中将连接委托设置为 nil。
  • 如果需要数据(可能供以后使用),您可以使用 NSNotification 通知委托任何连接事件,而不是委托模式。
  • 正如杰克在他的评论中建议的那样,您可以使您的委托成为连接的弱属性 - 如果您的项目使用 ARC,这可能是最好的解决方案
于 2012-10-04T18:52:25.050 回答
0

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

- (void)dealloc
{
   [yourWebServiceRequest cancelRequestAndClearDelegate]; 
   [super dealloc];
}
于 2012-10-04T18:49:26.793 回答