委托ivars作为指针

时间:2013-07-13 14:07:43

标签: iphone ios objective-c delegates

我一直在查看我的代码,我通常会将我的委托ivars声明为这样的指针:

__weak NSObject <ViewControllerDelegate> *delegate;

我注意到Apple在他们的示例代码中声明了这些:

__weak id <ViewControllerDelegate> delegate;

使用NSObject或id有什么区别?

使用*声明为指针之间的区别是什么,因为使用委托似乎没有改变它是否是指针,

谢谢, 约翰

1 个答案:

答案 0 :(得分:6)

id确实是pointer to some random object

因此,根据您是否有指针,idNSObject*之间没有区别。

否则会有很大的不同。

id <MyDelegateP> delegate表示delegate 是指向某个对象的指针,该对象仅保证实现MyDelegateP协议中的方法,不多于

NSObject <MyDelegateP>*表示delegate 是指向某个对象的指针,该对象是NSObject(或子类)的实例,并且还实现MyDelegateP中的所有方法协议

目前,大多数协议都声明为继承自<NSObject>协议。

@protocol MyDelegateP <NSObject>
@end

由于<NSObject>协议声明了哈希,内存管理和内省等基本服务(并且几乎不可能使用不从NSObject继承的类)这样做会导致可以放入集合的委托,可以为方法实现(对于可选方法)等进行内省...


所以,这样做:

 @protocol ViewControllerDelegate <NSObject>
 ...
 @end

然后这个:

__weak id <ViewControllerDelegate> delegate;

但这没有任何问题(它添加了一些不在NSObject协议中的方法,并且稍微多余,但仍然可以):

__weak NSObject <ViewControllerDelegate> *delegate;