我想知道以下代码行正在做什么:
@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
}
答案 0 :(得分:12)
JustSid的回答是现场的,但只是澄清了一点:
与其他OO语言相比,Objective-C缺少接口。相反,Objective-C使用由@protocol
指令标记的协议。
id
数据类型是一个匿名对象。它是一个Objective-C对象 - 编译器可以肯定。编译器知道为指向对象的指针保留了多少空间,但是在编译时它不知道它是NSString
,UIViewController
还是什么。
因此,当您使用id
类型时,您可以指定(在尖括号中)匿名对象应遵守的协议。
在上面的代码中,编译时,编译器将检查您设置为CategoryAddViewController委托的任何对象,并仔细检查您是否已实现协议中定义的任何所需方法。
总结一下,使用id
类型时使用尖括号将有助于编译器告诉您何时做蠢事。
所有这些都是为了编译时 - 如果你需要在运行时100%偏执,你可以使用conformsToProtocol:@protocol(foo)
来测试合规性(我相信这是任何NSObject上的方法)。
答案 1 :(得分:4)
确保传递符合给定协议的Objective-C对象。多数民众赞成,如果没有,编译器将发出警告,但仅此而已。