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



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

上述方案工作正常。但是,如果我从该特定视图移动到任何其他视图,则当图像加载完成后,委托会尝试发送消息并导致错误。

我尝试设置

imageFetcher.delegate=nil;

在视图上没有卸载。同样在下载类中调用委托方法之前,我检查委托为零。

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

if(delegate!=nil)
{
  [delegate imagefetcherView:self didLoadImage:image];
}

如何修复此错误?

谢谢

不要依赖viewDidUnload进行任何清理。这仅在iOS 6之前的iOS版本中调用,并且仅在由于内存压力而卸载视图时调用(但不是在您关闭/弹出视图时(。

将委托设置为在dealloc方法或viewDidDisappear或任何适当的位置nil

与选择nil delegate方法相关的两个注意事项:

  1. 请注意,如果您推送/呈现另一个视图控制器,即使当前视图控制器尚未关闭,也会调用 viewWillDisappearviewDidDisappear。仅当所讨论的视图控制器从未推送/呈现另一个视图控制器时,才依赖这些与消失相关的方法。

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

顺便说一下,我发现您正在让图像获取继续,即使视图控制器已被关闭。您可能不仅要nil委托,还要取消请求。这取决于 (a( 您是否正在使用甚至允许取消的抓取(例如NSURLConnectionDataDelegate方法或 AFNetwork 操作(,如果是,(b( 您是否希望取消它。但是,很容易占用宝贵的网络资源(尤其是在蜂窝连接速度较慢的情况下(,即使用户不再需要请求,请求也会继续。这取决于您的应用程序的详细信息。

无论如何,不要依赖viewDidUnload

viewDidUnload

iOS 6+中不被调用。

你应该使用这个

-(void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
     imageFetcher.delegate=nil;
}

你仍然可以在你的类中有一个 dealloc 调用,但它不应该调用 [super dealloc]。如果添加它,则可以在此处设置断点,并查看其从何处将其保留计数变为 0。或者使用仪器跟踪控制器的保留/释放周期。

我会实现一个单独的缓存来临时存储护理视图中的图片 控制器被释放,但图片可以再次使用,例如,如果用户返回同一页面。

在这种情况下,您将拥有一个长期存在的缓存对象作为delegate。例如,视图控制器可以订阅以在这些视图控制器可见时接收有关传入图片的键值通知(只是不要忘记在viewWillDisappear中取消订阅 KVO(。

如果您的控制器不可见但可能会再次显示,您将在缓存中显示图片(如果内存不足,则删除(;当然,如果您的图片永远不会再次显示并删除图片,您也可以签入缓存。

最新更新