Obj-C中的id和Delegate用法

时间:2010-12-25 22:44:03

标签: objective-c ios delegates

我想知道以下代码行正在做什么:

@property (assign, nonatomic) id <CoursePlannerDelegate> delegate;

即我想知道这部分内容:

id <CoursePlannerDelegate> delegate;

它也出现在其他地方:

@interface CategoryAddViewController : UIViewController {

 UITextField *nameField, *weightField;
 double maxWeight; //The maximum weight that can be allocated to this Category (max value of 100)
 id <CategoryAddDelegate> delegate; //A Course Planner TVC

}

2 个答案:

答案 0 :(得分:12)

JustSid的回答是现场的,但只是澄清了一点:

与其他OO语言相比,Objective-C缺少接口。相反,Objective-C使用由@protocol指令标记的协议。

id数据类型是一个匿名对象。它是一个Objective-C对象 - 编译器可以肯定。编译器知道为指向对象的指针保留了多少空间,但是在编译时它不知道它是NSStringUIViewController还是什么。

因此,当您使用id类型时,您可以指定(在尖括号中)匿名对象应遵守的协议。

在上面的代码中,编译时,编译器将检查您设置为CategoryAddViewController委托的任何对象,并仔细检查您是否已实现协议中定义的任何所需方法。

总结一下,使用id类型时使用尖括号将有助于编译器告诉您何时做蠢事。

所有这些都是为了编译时 - 如果你需要在运行时100%偏执,你可以使用conformsToProtocol:@protocol(foo)来测试合规性(我相信这是任何NSObject上的方法)。

答案 1 :(得分:4)

确保传递符合给定协议的Objective-C对象。多数民众赞成,如果没有,编译器将发出警告,但仅此而已。