1

私はUIViewをサブクラス化して、drawRect:をオーバーライドしてカスタムビューを作成しています。ビューの幅の10パーセントに等しいポイントを見つける必要があります。もちろん、その距離を計算するのは簡単です(self.bounds.size.width / 10.0f)。この値をキャッシュしたいのですが、つまり、すべてのdrawRect:で計算する必要がないように、この値をインスタンス変数に格納したいと思います。

この値をどのメソッド内に保存しますか?initWithFrame:で変数の値を保存することを考えていましたが、サイズを変更すると、キャッシュされた値がビューの幅と同期しなくなります。

ビューの幅をキャッシュするのに最適な場所はどこですか...そしてそれでも大丈夫かどうかについての考えはありますか?

4

2 に答える 2

3

値をivarに保存し、layoutSubviewsで(再)計算できます。

ただし、これは時期尚早の最適化の明らかなケースです。優れたコードの記述に集中し、必要性が明らかになったときに最適化する必要があります。実際、この「最適化」はアプリのパフォーマンスに悪影響を与える可能性さえあります。2つの数値を除算したり、ivarの値を調べたりする方がコストがかかるのでしょうか。

于 2011-10-18T02:09:32.593 に答える
3

その距離を計算するのは簡単です(self.bounds.size.width / 10.0f)..。

この値をキャッシュしたいのですが、つまり、すべてのdrawRect:で計算する必要がないように、この値をインスタンス変数に格納したいと思います。

ここのすべては些細なことです。キャッシュする理由はありません。

あなたが持っている:

  • 1つのobjcメッセージ(キャッシュされた値にアクセスするために使用します)
  • 次に、構造体内の構造体のフィールドにアクセスします(実質的に無料)。
  • 次に、浮動小数点除算を実行します(操作に比べてまだ小さい)

ビューの幅をキャッシュするのに最適な場所はどこですか...そしてそれでも大丈夫かどうかについての考えはありますか?

最高の場所はここです:

- (void)drawRect:(CGRect)rect {
  // ...
  const CGFloat tenthWidth = self.bounds.size.width * 0.10f;
  // ...
}

逆数による乗算の使用にも注意してください;)

于 2011-10-18T05:19:30.397 に答える