2

自動生成されたアクセサー メソッドのオーバーライドについて質問があります。各ゲッターが他のゲッターを参照するため、次は機能しません(私は信じています)。アクセサー メソッドが他のアクセサー メソッドを使用してはならないという規則はありますか? それとも、これらの状況を個別に監視する必要がありますか?

-(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

まず、自分の利益のために賢くなりすぎないでください。ボトルネックを克服したい場合は、最初に測定して、それが本当にそこにあることを確認してください。コードが本質的に役に立たないように、両方とも内部遅延読み込みを行うUIImageと思います。NSData次に、本当にそのようなことを手作業で行いたい場合でも、メインクラスのコードを汚染しないように、キャッシュコードを別のクラスに分割してみてください。

アクセサについてのルールはありません(少なくとも私が知っていることはありません)。なぜなら、人々はアクセサで遅延読み込みをあまり行わないからです。[UIViewController loadView]怠惰との組み合わせによって引き起こされる無限ループに巻き込まれることがありますが[UIViewController view]、それだけです。

于 2010-09-14T06:59:36.570 に答える
2

禁止するものは何もありませんが、紛らわしいコードを書いていることは間違いありません。基本的に、これら 2 つのプロパティには循環依存関係があります。これは、読み取りとデバッグの両方が困難です。「画像をロードする」前に「データをロードする」理由、または「データをロードする」前に「画像をロードする」ことをサポートする理由、または実際に2つのプロパティがどのように機能するかは明確ではありませんは実際には 2 つの異なるものです。

于 2010-09-14T06:51:19.103 に答える
0

この例で実際に行っていることは、ロードに長い時間がかかる可能性があります。スレッドセーフであることを確認するのが最善です。

さらに、データオブジェクトを(通常はプロトコルを使用して)実際のデータプロバイダーにし、クラスとは別にして、遅延ロードされたオブジェクトを処理していることをイメージコンテナーに公開すると、さらに良いでしょう(これにより、一部のオブジェクトからの抗議が発生する可能性があります)人)。

具体的には、プロバイダーからデータ/イメージのロードを呼び出し、(たとえば)awakeFromNibから呼び出すことができます。その後、ローダーが実行され、セカンダリスレッドにデータがロードされます(特にダウンロードされた場合)。データプロバイダーにコールバックを提供して、イメージの準備ができたことをビューに通知します(通常はプロトコルを使用します)。ビューがアーカイブされていないイメージを取得したら、データプロバイダーを無効にします。

最後に、アプリリソースを扱っている場合、「システム」はこれの一部をキャッシュしてくれるので、舞台裏ですでに最適化されているものに対して作業しようとしていることになります。

要するに、それは通常は大丈夫です(例えば、怠惰な初期化ではありません)-しかし、この特定の設計(別のポスターが言ったように)には、最小化されるべき循環依存があります。

于 2010-09-14T07:32:02.670 に答える