两个接口?

时间:2011-12-30 23:57:54

标签: iphone objective-c ios

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 个答案:

答案 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及更早版本中不可用。)