私はここで注意してください:このような場合は、あなたが記述している特別なケースはあまりありません。ほとんど確実に使いすぎで、viewWillAppear
という2つのバージョンではなく、viewDidLoad
とviewWillAppear
に分かれているはずです。それは問題が浮上していると言いました。
これは私がしたいことを指し示すSEL
のままにしておくことをお勧めします。例えば、私は複雑な非同期の活動の後に「次のアクション」のためのこの種の技術を使用します。
if (self.nextActionSelector != NULL)
{
[self performSelector:self.nextActionSelector];
}
だから、これのために、あなたは時間をかけて変更されるだろう、とviewWillAppear
はちょうど何でも呼ぶようviewWillAppearSelector
を使用することができますそれはを指します。
ベンが推奨する方法スウィズルは、場合によっては便利ですが、自分ではなく既存のオブジェクトの動作を変更しようとしているときによく使用されます。それは本当にデバッグの楽しみを作ることができます.... OK、実際には楽しいものではありません。痛いとても痛い。
それ以外では、私は-forwardInvocation:
を見ると、直接実装していないメッセージに応答することができます。呼び出しを書き換えて、本当に必要なメソッドを呼び出すことができます。しかし、これは実際に使用される方法ではありません。他のオブジェクトへの呼び出しを透過的に転送するためのものです。しかし、少なくともデバッグすることは、デバッガが期待するところに行くので難しくありません。
通常、この場合、ブール値ではなく、前に実行した証拠を探します。 view
が既に設定されているかどうかを確認したり、初めて特殊な変数を必要としないように初期化された他の値をチェックして、状態がクリアなものに弾力をつけます(メモリが逼迫しているiPhoneのダンプのような) 。可能な限り、私はこれらのものを外部のパーティに特別な初回ロジックを持たせるのではなく、ゲッタで自己初期化させる。ロジックをここに単純にしておくと、メンテナンスがずっと楽になりますね。NSInvocation
は狂っています(テストではメソッド呼び出しより約500倍遅いですが、私はパフォーマンス、メンテナンス性についてこの決定を下すことを示唆していません)。
これはシングルトンでないクラスでは非常に問題です。メソッドルックアップテーブルはインスタンスではなくクラスであるため、スウィズルがクラスのすべてのインスタンスに適用されるためです。 – Chuck
クラスのチャックリマッピング実装に同意すると、追跡が非常に難しい多くのバグが発生する可能性があります。また、私はコードを「読みにくくする」というあなたの主張に同意しません。標準パターンのいずれかを使用すると、ジュニアプログラマでもコードを読むのはかなり簡単です。あなたの解決策は、コードをより困難にする、すなわち「読みにくくする」ようにします。 –
最初のdrawRect:が以降のdrawRect:呼び出しと異なる必要がある場合について説明できますか?キャッシュする場合は、drawRectではなくgetterにキャッシュします。ビューは画面上で出て来ることができるので、drawRect:への「最初の」呼び出しが何を意味するかははっきりしていません。最初の授業は?例えば初めて?私たちがスクリーンに置かれて以来初めて?最初にビューがロードされてから(何度も起こることがあります)?あなたが攻撃している具体例がありますか? –