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被定义了两次?还有()的含义是什么?不应该有一个类名,也许是括号之间的超类吗?
答案 0 :(得分: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及更早版本中不可用。)