委托ivars作为指针

Woo*_*ock 1 iphone delegates objective-c ios

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

__weak NSObject <ViewControllerDelegate> *delegate;
Run Code Online (Sandbox Code Playgroud)

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

__weak id <ViewControllerDelegate> delegate;
Run Code Online (Sandbox Code Playgroud)

使用NSObject或id有什么区别?

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

谢谢,约翰

bbu*_*bum 6

id真的pointer to some random object.

因此,您是否有指针之间id和之间没有区别NSObject*.

否则会有很大的不同.

id <MyDelegateP> delegatemeans delegate 是一个指向某个对象的指针,只保证在MyDelegateP协议中实现这些方法,不多也不少.

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

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

@protocol MyDelegateP <NSObject>
@end
Run Code Online (Sandbox Code Playgroud)

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


所以,这样做:

 @protocol ViewControllerDelegate <NSObject>
 ...
 @end
Run Code Online (Sandbox Code Playgroud)

然后这个:

__weak id <ViewControllerDelegate> delegate;
Run Code Online (Sandbox Code Playgroud)

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

__weak NSObject <ViewControllerDelegate> *delegate;
Run Code Online (Sandbox Code Playgroud)