2

カスタム セッターの if ステートメントの目的は何ですか? このルーチンは、サンプル コードでよく見かけます。ARC を使用して提供されているのに、わざわざ等価性をチェックする必要があるのはなぜですか?

- (void)setPhotoDatabase:(UIManagedDocument *)photoDatabase
{
    if (_photoDatabase != photoDatabase) {
        _photoDatabase = photoDatabase;
        ...
    }
}
4

4 に答える 4

2

重要な部分は通常、変更に続くもの ( の内容...) です。つまり、新しい値を割り当てた後の副作用であり、非常にコストがかかる可能性があります。

これらの変更を制限して、不必要で非常にコストがかかる可能性のある副作用を引き起こさないようにすることをお勧めします。ドキュメントを変更すると、モデルの変更だけでなく、そのドキュメントに関連する UI のかなりの割合を変更する必要がある可能性があります。

条件を確認すると、かなりの量の不要な変更作業が短絡し、不要な変更を回避してしまう可能性があります。

このような不必要な副作用は、CPU、描画、オブジェクトの作成、ディスクへの書き込みなど、ほとんどすべてに関するアプリの実際の作業を簡単に覆す可能性があります。

信じられないかもしれませんが、多くのアプリは、非常によく設計されていても、かなりの量の不要な作業を実行しています。ビューベースのレンダリング システムでの描画と UI の更新は、おそらく私が考えることができる最良の例です。そのドメインには、冗長な描画を最小限に抑えるために実装できる詳細がたくさんあります。

于 2012-09-26T19:11:14.670 に答える
1

カスタム セッターをオーバーライドして実装する主な理由の 1 つは、プロパティの変更に応じて追加のコードを実行することです。プロパティが実際に変更されない場合、なぜそのコードを実行するのでしょうか?

于 2012-09-26T19:08:26.613 に答える
1

答えは通常、...コメントアウトしたセクションにあります。そこに何もない場合、コードは意味がありません。ただし、その場所にある典型的なものは、次のような自分のデリゲートの何らかの通知です。

[myDelegate photoDatabaseDidChanged:photoDatabase];

photoDatabaseが実際に変更されていない限り、これを呼び出すべきではありません。呼び出しは、デリゲートが実際に何をするかに応じて、「高価」から「非常に高価」まで、コストがかかる場合があります。新しいライブラリの画像で画面を更新したり、新しい画像をクラウドに保存したりすることができます。変更を報告する必要がない場合は、バッテリーとネットワーク帯域幅とともに、CPU サイクルを浪費している可能性があります。コードはデリゲートが何をしようとしているのかを知る方法がないため、変更が発生しない限り、コールバックを避ける必要があります。

于 2012-09-26T19:12:49.903 に答える
0

等しいかどうかを確認すると、メソッドに渡されるパラメーターの冗長な割り当てを防ぐことができます。

このようにして、サンプル メソッドの photoDatabase に変更がない場合、括弧内のすべてのコードを実行するコストを (たとえ小さくても) 回避できます。

例(あなたの例を拡張する):

- (void)setPhotoDatabase:(UIManagedDocument *)photoDatabase
{
    if (_photoDatabase != photoDatabase) 
    {
        _photoDatabase = photoDatabase;

        // do stuff
        // do more stuff
        // do even more stuff
        // do something really expensive
    }
}

例からわかるように、最初に photoDatabase が渡されたものと一致しないかどうかを確認すると、メソッドを終了することができ、不要な追加コードを実行する必要はありません。

于 2012-09-26T19:09:10.140 に答える