消息发送到解除分配的实例ARC

Zac*_*ach 2 delegates objective-c ios automatic-ref-counting

我正在做一个从服务器下载图像并将其显示在视图上的应用程序.我正在使用代表.图像完成加载后,委托会向视图发送消息以显示图像.

上面的场景运行正常.但是,如果我从该特定视图移出到任何其他视图,则在完成图像加载时,委托会尝试发送消息并导致错误.

我试过设置

imageFetcher.delegate=nil;
Run Code Online (Sandbox Code Playgroud)

在视图didUnload.在下载类中调用委托方法之前,我检查委托是否为nil.

但我可以看到委托对象不是零.

if(delegate!=nil)
{
  [delegate imagefetcherView:self didLoadImage:image];
}
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个错误?

谢谢

Rob*_*Rob 7

不要依赖viewDidUnload做任何清理工作.这仅在iOS 6之前的iOS版本中调用,并且仅在由于内存压力而卸载视图时才会调用(但不是在您解除/弹出视图时).

将您的委托设置nildealloc方法中viewDidDisappear或任何适当的地方.

相关的采摘哪种方法你会两点需要说明nildelegate:

  1. 请注意,viewWillDisappearviewDidDisappear,如果你推/存在的另一种视图控制器也将被调用,即使当前一个尚未被开除.如果所讨论的视图控制器没有推送/呈现另一个视图控制器,则仅依赖于这些与消失相关的方法.

  2. 如果使用该dealloc技术,请注意,这仅在图像提取器类delegateweak属性(并且通常应该是委托weak)时才有效.如果delegate是a strongretain属性,那将阻止视图控制器dealloc被调用.

顺便说一句,我认为即使视图控制器已被解除,您仍然可以继续获取图像.您可能不仅nil需要委托,还要取消请求.这取决于(a)您是否正在使用甚至允许取消(例如,NSURLConnectionDataDelegate进近或AFNetworking操作)的提取,如果是,(b)您是否希望取消.但是,很容易占用宝贵的网络资源(特别是在缓慢的蜂窝连接上),即使用户不再需要,也可以继续请求.这取决于您的应用程序的详细信息.

无论如何,不​​要依赖viewDidUnload.

  • @giorashc没有冒犯,但事实并非如此.`dealloc`仍然可用并在ARC中使用.唯一的区别是,正如但丁所说,你不称之为'[super dealloc]`.你通常不需要在ARC中使用`dealloc`(因为成员通常会为你释放),但你仍然可以使用`dealloc`方法. (5认同)
  • 仍然在ARC中调用dealloc,你只是不能释放或调用`[super dealloc]` (3认同)