Objective c Obj-C中的id和委托用法

Objective c Obj-C中的id和委托用法,objective-c,ios,delegates,Objective C,Ios,Delegates,我想知道下面这行代码在做什么: @property (assign, nonatomic) id <CoursePlannerDelegate> delegate; @属性(赋值,非原子)id委托; 也就是说,我想知道这部分线路: id <CoursePlannerDelegate> delegate; id代表; 它还出现在其他地方: @interface CategoryAddViewController : UIViewController { UITe

我想知道下面这行代码在做什么:

@property (assign, nonatomic) id <CoursePlannerDelegate> delegate;
@属性(赋值,非原子)id委托;
也就是说,我想知道这部分线路:

id <CoursePlannerDelegate> delegate;
id代表;
它还出现在其他地方:

@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

}
@interface CategoryAddViewController:UIViewController{
UITextField*nameField,*weightField;
double maxWeight;//可分配给该类别的最大重量(最大值为100)
id委托;//课程计划员TVC
}

它确保传递符合给定协议的Objective-C对象。就是这样,如果没有,编译器将抛出一个警告,但仅此而已。

JustSid的答案是正确的,但只是稍微澄清一下:

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

id
数据类型是匿名对象。这是一个Objective-C对象——编译器肯定会这么做。编译器知道为指向对象的指针保留多少空间,但在编译时不知道它是
NSString
、是
UIViewController
还是什么

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

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

总之,当您使用
id
类型时,使用尖括号将有助于编译器在您做蠢事时告诉您


所有这些都是针对编译时的——如果您在运行时也需要100%的偏执,您可以使用
conformsToProtocol:@protocol(foo)
来测试遵从性(我相信这是任何NSObject上的一种方法)。

感谢您的深入解释!那正是我要找的不客气。伙计,我希望我在开始用Obj-C编程时就知道这一点:)phooze,我该如何创建一个符合协议的类,这样我就可以进行id委托@Kyle-遵守协议的方法是实现协议中的方法。当您设置UITableViewController并实现所有UITableViewDelegate和UITableViewDataSource方法时,您正在实现一个协议。在头文件中,您需要在@interface声明之后添加,以告诉编译器您希望该类实现该协议。我认为“Objective-C缺少接口”是错误的。Objective-C有接口,它称之为协议,这就是这里的内容。并非所有语言都使用相同的术语,但这并不意味着它们“缺少”该功能。吹毛求疵,我知道。