Objective-C言語--カテゴリ


カテゴリの名前:
ファイル名(例):NSButtton+addition
文書の書き方:
@interface UIButton (Addition) {

//    __strong UIView *_myView;// 

}

カテゴリにはインスタンス変数を追加できませんが、属性を追加できます.カテゴリにインスタンス変数を追加できないのは、最初にコンパイラが「ベースアドレスプラスオフセット」のメカニズムを使用していたためで、インスタンス変数を追加すると、他のインスタンス変数のオフセットが変更され、「脆弱なベースクラスの問題」が発生します.Leopardシステムに導入された新しい64ビットObjective-C実行時(間接アドレス方式で変数の位置を決定する)に、Appleはこの問題を解決しましたが、Objective-Cプログラマーにこの機能をオープンしていません.
カテゴリに追加されたプロパティは@dynamicでなければなりません.@dynamicのプロパティコンパイラは自動的に生成されません.先頭の対応するインスタンス変数とgetter/setterメソッド.プログラマが手動で処理する必要があります.
カテゴリの欠陥:
1、インスタンス変数を追加することはできません.属性は@dynamicでなければなりません.
2、名前の競合が発生しやすく、カテゴリの優先度が高いと元のクラスのメソッドが上書きされます.
特殊なカテゴリ-クラス拡張
必要なのはmファイルにこのようなコードを追加すればよい.mファイルにインスタンス変数や属性を追加して使用し、外部には見えず、簡単な逆コンパイルではこれらの変数は見えず、コードのセキュリティをある程度保護しています.
@interface  HomeViewController (){
}

@end