我正在一个项目中执行图像的延迟加载。当图像下载器下载图像时,它将消息发送给其委托人以处理图像。但是,当它的一个视图控制器的委托从内存中释放时,我不希望imagedownloader类将消息发送给它的委托,因为它已经死了。我需要知道什么时候可以将imagedownloader的委托设置为nil?我的目标设置为iOS4.0,所以我不能使用弱引用。而且我有很多imagedownloader实例存储在字典中,准备将其完成消息发送给他们的代表。我必须将所有这些存储实例的委托设置为nil。
'

-(void)viewWillDisappear:(BOOL)animated
{
    for(imagedownloader *imagedownloaderObj in dict)
    {
        imagedownloaderObj.delegate = nil;
    }

    [super viewWillDisAppear:animated]
}


但它在循环中崩溃。请帮助任何人...并为我的英语不好对不起,但我希望你能解决我的问题。

最佳答案

您的代码有问题-您正在枚举一个字典,该字典枚举其键,而不是其对象。相反,您想执行以下操作:

for(ImageDownloader *imageDownloader in [imageDownloaderDictionary allValues])
{
    if (imageDownloader.delegate == self)
        imageDownloader.delegate = nil;
} //note - I've adjusted naming to match Objective-C style conventions. It fits in better with the framework code now.


另外,我想改为在dealloc中执行此操作。我不知道在取消分配之前总会得到一个viewWillDisappear:方法,在iOS的早期版本(包括iOS4)上,您当然不能保证。而且,如果您返回该视图,您也不想浪费时间再次下载图像。

10-08 06:07