作为指针的delegate实体变量

通常我会将代理实体变量作为指针声明:

__weak NSObject <ViewControllerDelegate> *delegate;

在苹果的样例中是这样:

__weak id <ViewControllerDelegate> delegate;

不知道使用id和NSObject的区别是什么?

使用 id 类型可以让代理实体变量指向任意类型的对象,而使用 NSObject 类型的变量只能指向继承自 NSObject 的类型的对象。


使用 id 类型的变量可以更灵活,但是也意味着在编译时无法对代理实体变量进行类型检查。也就是说,如果在使用代理实体变量时发生了类型转换错误,只有在运行时才能发现。而使用 NSObject 类型的变量则会在编译时进行类型检查,这样可以更早发现类型转换错误,提高代码的可靠性。


总的来说,使用 id 类型的代理实体变量可以提高代码的灵活性,但是也需要注意在使用时避免类型转换错误。