2011-12-30 5 views
0

DataController.h2つのインターフェイス?

@class Play; 

@interface DataController : NSObject 

- (unsigned)countOfList; 
- (Play *)objectInListAtIndex:(unsigned)theIndex; 

@end 

DataController.mは

#import "DataController.h" 
#import "Play.h" 


@interface DataController() 
@property (nonatomic, copy, readwrite) NSMutableArray *list; 
- (void)createDemoData; 
@end 


@implementation DataController 

@synthesize list; 


- (id)init { 
    if (self = [super init]) { 
     [self createDemoData]; 
    } 
    return self; 
} 

は、なぜあなたは二回@interface定義されていることと思いますか?そして()の意味は?かっこの間にスーパークラスがあるクラス名はありませんか?

+1

http://stackoverflow.com/questions/862299/how-を参照してください。 do-a-category-work-in-objective-c – XJones

答えて

7

一般に、構文@interface ClassName (CategoryName)はカテゴリを宣言するためのものです。カテゴリは、クラスにメソッドを追加する方法です。ソースコードを持たないクラスでもこれを行うことができます。詳細hereを参照してください。

@interface ClassName()(かっこはありません)は基本的にカテゴリの特殊なケースであり、クラス拡張と呼ばれます。クラス拡張とカテゴリの主な違いは、クラス拡張で宣言されたメソッドをクラスのメイン実装ブロックで定義または実装する必要があります。そうしないと、コンパイラの警告が表示されます。通常のカテゴリのメソッドは、外部の@implementationブロックで定義できます。

クラス拡張(この場合)の最も一般的な用途は、プライベートメソッドを宣言するためです。 Objective-Cは真のプライベートメソッドをサポートしていないので、同じ基本的な最終結果を達成する簡単な方法は、.mファイルの先頭にあるクラス拡張でプライベートメソッドを宣言することです。これらのメソッドは.hファイルでは定義されていないため、他のクラスでは表示されません。クラスに属していないクラスを使用しようとすると、警告が表示されます。

また、readonly @propertyをクラス拡張のreadwriteとして再宣言することもできます。こうすることで、クラス実装の外部のコードはプロパティの値のみを読み取ることができますが、クラスの実装の中では、それにも書き込むことができます。これは、@プロパティを再宣言することが許されている唯一のケースです。

(そのクラスの拡張は、Objective-Cの2.0の新機能だったとMac OS X 10.4およびそれ以前には利用できないことに注意してください。)

+1

あなたは生成されたアクセサーを変更する**再宣言** '@ property'について言及していますが、単に** **' @ property'をへのクラス拡張。 –

+0

これは素晴らしい答えですが、カテゴリとプロトコルの混同を避けるため、 '@interface ClassName(ProtocolName)'を '@interface ClassName(CategoryName)'に変更しました。 – EmilioPelaez

+0

@EmilioPelaezはダムのタイプミスで、私はそれを修正しました。それをキャッチするためにありがとう。非公式のプロトコルを宣言するためにカテゴリが使用されることに言及する価値があるかもしれません... –

関連する問題