2009-04-05 8 views
1

私が見たカテゴリの例はすべて、カスタムクラスではなくObjective-Cクラスを使用しています。たとえば、NSMutableArray、NSArray、NSStringなどです。カスタムクラスのカテゴリを作成したいと思います。ここで私はちょうどテストするために作成された役に立たない例だが、コンパイルに失敗:カテゴリはObjective-Cクラスでのみ作成できますか?

//person.h 
@interface Person (aCategory) : NSObject { 
NSString *MyName; 
NSString *webAddress; 
} 
@property(nonatomic, retain) NSString *MyName; 
@end 

//person.m 
#import "Person+aCategory.h" 

@implementation Person 
@synthesize MyName; 
@end 

そしてカテゴリ定義:

@interface aCategory : NSObject { 
NSString *webAddress; 
} 
@property(nonatomic, retain) NSString *webAddress; 
- (void)changeWebAddress; 
@end 

//in aCategory.h 
#import "aCategory.h" 

@implementation aCategory 
@synthesize webAddress; 

- (void) changeWebAddress{ 
self.webAddress = @"http://www.abc.com"; 
} 
@end 

これは、次のエラーや警告を与える:

error: Person+aCategory.h: no such file or directory 
warning: cannot find interface declaration for Person 
error: no declaration of property 'MyName' found in interface 

がありますこれを行う方法?

答えて

3

定義したカスタムObjective-Cクラスは、依然としてObjective-Cクラスです。はい、カテゴリを作成することができます。ここで問題となるのは、あなたが書いたことは、カテゴリを定義する正しい方法ではないということです。

まず、プレーンクラスを定義します。すべてのインスタンス変数とそこに必要なメソッドを置いてください。

次に、カテゴリを定義します。カテゴリは、そのクラスにメソッドを追加します。カテゴリは、既存のクラスにメソッドを追加するだけなので、親クラスまたは子クラスから降下しません。

詳しくは、AppleのThe Objective-C Programming Languageを参照してください。

+0

>>ここでの問題は、あなたが書いたことは、遠隔カテゴリを定義するための正しい方法ではないということです<< [OK]をクリックします。。私の例を修正できますか? – 4thSpace

1

任意のObjective-Cクラスでカテゴリを作成できます。通常、クラスを直接変更することはできないため、例はNSクラスのカテゴリを示しています。これは、クラスへのソースコードを持っている場合に行うことです。

私は通常プライベートメソッドのために自分のクラスのカテゴリを使用しますが、私はそれらのための別のクラスを作成しません、私は.mファイルのカテゴリの@interfaceを宣言します。

Here's a linkカテゴリの使用を要約した回答です。

コメントに続いて、これはコードを書き換えるための一つの方法である:

//person.h 
@interface Person : NSObject { 
    NSString *myName; 
    NSString *webAddress; 
} 
@property(nonatomic, copy) NSString *myName; 
@property(nontatomic, copy) NSString *webAddress; 
@end 

//person.m 
#import "Person.h" 

@interface Person (aCategory) 
- (void)changeWebAddress; 
@end 

@implementation Person 
@synthesize myName; 
@synthesize webAddress; 
@end 

@implementation Person (aCategory) 
- (void)changeWebAddress { 
    self.webAddress = @"http://www.abc.com"; 
} 
@end 
+0

リンクのコードを自分のものに適用しようとしましたが、まだエラーが表示されています。Personのインターフェイス宣言が見つかりません。 – 4thSpace

+0

インターフェイスと実装ファイルを書き直す方法を示す回答が更新されました。 – Abizern

+0

ありがとうございます。私はカテゴリーの利益を見ていないよ。 Personは、aCategoryから何も必要とせずにchangeWebAddressメソッドを使用して完全に正常に動作するように見えます。 – 4thSpace

関連する問題