Objective-c分類と拡張

2271 ワード

分類と拡張
分類では、このクラスのソースコードがなくても、既存のクラスにメソッドを追加できます.分類の強力な機能は、サブクラスを使用せずにクラスを拡張できる機能にあります.分類を使用すると、クラスの実装をいくつかの異なるファイルに分散することもできます.クラス拡張は分類と似ていますが、@interface以外の場所でクラス宣言APIを許可します.
クラスへのメソッドの追加
クラスのインタフェースファイルの分類名の下でクラス宣言メソッドを宣言し、実装ファイルの同じメソッド名の下で実装できます.分類名は、新しいクラスではなく、クラスに宣言するいくつかのメソッドを表します.ただし、分類はクラスに新しいインスタンス変数を宣言することはできません.
分類追加の方法はクラスタイプの一部になります.たとえば、分類にNSArrayを追加する方法は、コンパイラがNSArrayインスタンスをコンパイルするときに一緒にコンパイルされます.サブクラスを介してNSArrayクラスに追加されるメソッドは、NSArrayのインスタンスにコンパイルされません.(静的指定タイプのクラスにのみ有効です.静的指定タイプの場合、コンパイラはオブジェクトのクラスタイプを知ることができます.)
分類のメソッド同類で定義されたメソッドと同じです.実行時、彼らには何の違いもありません.分類によって追加する方法も同様に布団類に継承できる.
分類の宣言は、同じクラスインタフェースの宣言とよく似ています.異なるのは、分類名がクラス名の後ろのカッコに書かれ、スーパークラスの宣言がないことです.クラスの分類は、クラスのインスタンス変数にアクセスしない限り、クラスのインタフェースファイルを参照する必要があります.
#import "ClassName.h"
 
@interface ClassName ( CategoryName )
// method declarations
@end

注意:分類はクラスに追加のインスタンス変数を宣言することはできません.宣言されたのは方法だけです.ただし、クラスが宣言するインスタンス変数は、@privateタイプの変数でも分類で使用できます.
1つのクラスに複数の分類数を宣言することはできますが、各分類名は異なり、各分類で異なるメソッドのセットを定義することができます.
拡張
クラスの拡張は匿名の分類のようなものであり,拡張で宣言する方法は関連クラスの@implementationで実現しなければならない.Clang/LVM 2.0コンパイラでは、拡張機能で属性とインスタンス変数を宣言することもできます.
拡張機能は、宣言された読取り専用プライベート属性を読み書きとして再宣言するためによく使用されます.
@interface MyClass : NSObject
@property (retain, readonly) float value;
@end
 
// Private extension, typically hidden in the main implementation file.
@interface MyClass ()
@property (retain, readwrite) float value;
@end

注意拡張と分類は、2番目のセグメントコードの@interfaceの後ろのカッコで名前を指定する必要はありません.
拡張はまた、クラスがAPIを公開的に宣言し、クラスが拡張してプライベートなメソッドを定義する場合にもよく使用されます.クラス拡張により、プライマリクラスの@interface , :
@interface MyClass : NSObject
- (float)value;
@end
 
@interface MyClass () {
    float value;
}
- (void)setValue:(float)newValue;
@end
 
@implementation MyClass
 
- (float)value {
    return value;
}
 
- (void)setValue:(float)newValue {
    value = newValue;
}
 
@end

setValue:メソッドは@implementationで実装する必要があります(分類では実装できません).そうでない場合、コンパイラはsetValue: 。が見つからないと警告します.
交流討論を歓迎します.転載は出典を明記してください.本住所:http://www.sjslibrary.com/?p=254