2011-12-30 54 views
0

DataController.h兩個接口?

@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 2011-12-31 00:01:11

回答

7

通常,語法@interface ClassName (CategoryName)用於聲明一個類別。類別是向類中添加方法的一種方式。即使對於沒有源代碼的類,也可以這樣做。查看更多here

@interface ClassName()(在括號中沒有任何內容)本質上是一個類別的特殊情況,稱爲類擴展。類擴展和類別之間的主要區別在於,在類擴展中聲明的方法必須在類的主@implementation塊中定義/實現,否則會得到編譯器警告。常規類別中的方法可以在外部@implementation塊中定義。

類擴展(在這種情況下)最常見的用途是聲明私有方法。 Objective-C不支持真正的私有方法,因此實現相同基本最終結果的簡單方法是在.m文件頂部的類擴展中聲明私有方法。由於這些方法沒有在.h文件中定義,所以其他類將不會看到它們,並且如果您嘗試在它們所屬的類之外使用它們,將會收到編譯器警告。

您還可以在類擴展中重新聲明readonly @property爲readwrite。這樣,類實現外部的代碼只能讀取屬性的值,但在類的實現中,也可以寫入它。這是唯一可以重新聲明@property的情況。

(請注意,類擴展是在Objective-C 2.0中的新功能,它們不能在Mac OS X 10.4及更早版本。)

+1

你提到**重新聲明**'@ property'來改變生成的訪問器,但是你沒有提到你可以簡單地**聲明**'@ property'類擴展。 – 2011-12-31 00:40:30

+0

這是一個很好的答案,但是,我會將'@interface ClassName(ProtocolName)'更改爲'@interface ClassName(CategoryName)',以避免類別和協議之間的混淆。 – EmilioPelaez 2011-12-31 00:53:45

+0

@EmilioPelaez這是一個愚蠢的錯字,我已經修復它。感謝您的支持。值得一提的是,類別有時用於聲明非正式協議...... – 2011-12-31 01:23:40