|
|
Log In | Not a Member? |
Contact ADC |
| < 前ページ次ページ > |
クラスにメソッドを追加するには、インターフェイスファイルでカテゴリ名の下にメソッドを宣言し、実装ファイルで同じ名前の下にメソッドを定義します。カテゴリ名は、メソッドが、新しいクラスではなく、どこか他の場所で宣言されたクラスへの追加であることを示します。ただし、カテゴリを使って、クラスにインスタンス変数を追加することはできません。
カテゴリが追加するメソッドは、クラス型の一部になります。たとえば、カテゴリを使用してNSArrayクラスに追加したメソッドは、コンパイラがNSArrayインスタンスのレパートリーに含まれていると想定するメソッドの一部となります。NSArrayクラスのサブクラスに追加されたメソッドは、NSArray型には含まれません(静的な型定義はコンパイラがオブジェクトのクラスを認識できる唯一の方法であるため、これが問題になるのは静的に型定義されたオブジェクトに関してのみです)。
カテゴリメソッドは、クラス自体で定義したメソッドで可能なことはすべて実行できます。実行時には、まったく違いがありません。カテゴリがクラスに追加するメソッドは、他のメソッドと同様に、すべてのクラスのサブクラスによって継承されます。
カテゴリインターフェイスの宣言は、クラスインターフェイス宣言とよく似ています。ただし、クラス名の後にカテゴリ名を丸括弧で囲んでリストアップし、スーパークラスを記述しない点が異なります。メソッドがクラスのインスタンス変数にアクセスしないかぎり、カテゴリは拡張するクラスのインターフェイスファイルをインポートする必要があります。
#import "ClassName.h" |
@interface ClassName ( CategoryName ) |
// メソッド宣言 |
@end |
この実装は、通常どおり、自身のインターフェイスをインポートします。共通の命名規則により、カテゴリの基本的なファイル名は、カテゴリが及ぶクラス名の後に「+」が付きその後にカテゴリ名が続きます。したがって、カテゴリ実装(ClassName+CategoryName.mというファイル内)は次のようになります。
#import "ClassName+CategoryName.h" |
@implementation ClassName ( CategoryName ) |
// メソッド定義 |
@end |
カテゴリでは、クラスの追加インスタンス変数を宣言できないことに注意してください。カテゴリはメソッドだけを含みます。ただし、クラスの有効範囲内にあるすべてのインスタンス変数は、カテゴリの有効範囲内にもあります。これには、クラスで宣言されているすべてのインスタンス変数のほか、@privateとして宣言されているインスタンス変数も含まれます。
クラスに追加できるカテゴリの数には制限がありませんが、各カテゴリの名前は異なっている必要があり、それぞれが異なるメソッドのセットを宣言して定義する必要があります。
| < 前ページ次ページ > |
Last updated: 2007-10-31
|
Get information on Apple products.
Visit the Apple Store online or at retail locations. 1-800-MY-APPLE Copyright © 2007 Apple Inc. All rights reserved. | Terms of use | Privacy Notice |