2

我有一个关于覆盖自动生成的访问器方法的问题。以下方法不起作用(我相信),因为每个 getter 都引用了另一个 getter。有没有规定访问器方法不应该使用其他访问器方法,或者您只需要单独注意这些情况?

-(UIImage *) image{

    if(image == nil){
        if(self.data == nil){
            [self performSelectorInBackground: @selector(loadImage) withObject: nil]
        }else{
            self.image = [UIImage imageWithData: self.data];
        }
    }

    return image;
}

-(NSData *) data {

    if(data == nil){
        if(self.image == nil){
            [self performSelectorInBackground: @selector(loadData) withObject: nil]
        }else{
            self.data = UIImageJPEGRepresentation(self.image, 0.85);
        }
    }

    return data;
}

我必须强调,这里介绍的图像使用只是一个示例,在这个特定示例中关于做什么的想法不如在一般情况下重要。

4

3 回答 3

3

首先,不要为了自己的利益而太聪明。如果你想克服一些瓶颈,首先测量并确保它确实存在。我相信两者都UIImageNSData一些内部延迟加载,这样你的代码可能基本上没用。其次,即使你真的想手工做类似的事情,也可以尝试将缓存代码拆分成一个单独的类,这样就不会污染主类的代码。

没有关于访问器的规则(至少我知道没有),因为人们不会在访问器中做太多的延迟加载。有时我会陷入由 lazy[UIViewController loadView]与 结合引起的无限循环[UIViewController view],但仅此而已。

于 2010-09-14T06:59:36.570 回答
2

没有什么可以禁止它,但是您肯定会编写一些令人困惑的代码。本质上,这两个属性具有循环依赖关系。这很难阅读和调试。目前尚不清楚为什么要在“加载图像”之前“加载数据”,或者为什么还要在“加载数据”之前支持“加载图像”,或者这两个属性如何真的是两个不同的东西。

于 2010-09-14T06:51:19.103 回答
0

您在此示例中实际执行的操作可能需要很长时间才能加载;最好确保它是线程安全的。

此外,如果你让数据对象成为一个真正的数据提供者(通常使用协议),与类分开,并让图像容器暴露它正在处理一个延迟加载的对象(这可能会引起某些人的强烈抗议),那就更好了。人们)。

具体来说,您可能希望从提供程序调用加载数据/图像,从 awakeFromNib 调用它(例如) - 然后加载程序运行并在辅助线程上加载数据(特别是如果已下载)。给数据提供者一个回调以通知视图图像已准备好(通常使用协议)。一旦视图获取未归档的图像,数据提供者就会失效。

最后,如果您正在处理应用程序资源,“系统”将为您缓存其中的一些资源,因此您将尝试针对已经在幕后优化的内容进行处理。

简而言之,通常没问题(例如,不是延迟初始化)-但是这种特定设计(正如另一位海报所说)具有循环依赖关系,应该最小化。

于 2010-09-14T07:32:02.670 回答