2

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

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

我尝试设置

imageFetcher.delegate=nil;

鉴于didUnload。同样在下载类中调用委托方法之前,我检查委托是否为零。

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

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

我该如何解决这个错误?

谢谢

4

4 回答 4

7

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

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

与选择哪种方法相关的两个nil警告delegate

  1. 请注意,如果您推送/呈现另一个视图控制器,即使当前的视图控制器尚未被解除,也会调用它viewWillDisappearviewDidDisappear如果有问题的视图控制器从未推送/呈现另一个视图控制器,则仅依赖这些与消失相关的方法。

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

顺便说一句,我收集到您让图像获取继续,即使视图控制器已被解除。您可能不仅想nil取消委托,还想取消请求。这取决于 (a) 您是否使用甚至允许取消的获取(例如NSURLConnectionDataDelegate方法或 AFNetworking 操作),如果是,则 (b) 您是否希望它取消。但是,很容易占用宝贵的网络资源(尤其是在蜂窝连接速度较慢的情况下),即使用户不再需要它,也可以让请求继续进行。这取决于您的应用程序的细节。

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

于 2013-10-10T16:35:12.950 回答
3

viewDidUnload在 iOS 6+ 中没有调用。

你应该用这个

-(void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
     imageFetcher.delegate=nil;
}
于 2013-10-10T16:34:56.527 回答
0

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

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

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

于 2013-10-10T21:01:41.437 回答
0

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

于 2013-10-10T19:55:37.993 回答