目标C代表声明

有人能告诉我之间的区别吗?

@property (nonatomic, weak) id delegate; @property (nonatomic, weak) id <protocol_name> delegate; @property (nonatomic, weak) UIViewController * <protocol_name> delegate; 

@property (nonatomic, weak) id delegate;

这指定当前类的对象具有可以是任何types的委托。 weak指定符对于委托对象是很常见的,因为这意味着委托对象不会增加委托的引用计数(在ARC中,称为“保留强引用”)。 weak代表参考是标准做法。

@property (nonatomic, weak) id < protocol_name > delegate;

这具体说明当前类的对象具有可以是任何types(id)但是必须符合protocol_name协议的委托。 这是特别有用的,因为包含委托的类知道它可以发送给委托的特定消息,并且“知道”代表将会响应它们。

@property (nonatomic, weak) UIViewController * < protocol_name > delegate;

除了委托必须是类UIViewController的对象之外,这与第二个示例相同。 实际上, delegate对象通常是idtypes的,尽pipe这不是必需的 – 它只是给程序员更大的自由度。


编辑:协议

假设你声明一个类如下:

 @interface MyObject : NSObject <MyDelegateProtocol> // ... @end 

这个声明中的<MyDelegateProtocol>意味着MyObject实现MyDelegateProtocol协议中定义的方法(即'符合协议')。

协议定义(在类定义之前,很明显)可能看起来像这样:

 @protocol MyDelegateProtocol <NSObject> @required - (void)method1; - (void)method2; @optional - (void)method3; @end 

这意味着任何符合MyDelegateProtocol协议的对象都必须实现一个名为-(void)method1-(void)method2 。 并且, 可选地 ,可以包括消息实现-(void)method3

这对于委托对象来说是非常有用的信息(协议名称可以是任何东西,我只是将“委托”这个词包含在委托协议中)。

如果另一个class级现在定义:

 @property (nonatomic, weak) id<MyDelegateProtocol> delegate; 

该类知道它可以依靠-method1-method2实现由它的委托来实现,并且-method3 也可以被实现(它可以检查如下的代码:)

 if ([self.delegate respondsToSelector:@selector(method3)]) { [self.delegate method3]; } else { // Delegate doesn't implement -method3. } 

-method1-method2的检查是不必要的,因为这些方法是由协议定义获得的,并且可以随时调用它们。

一个类也可以同时使用多个协议(例如<Proto1, Proto2, UITableViewDelegate> ),以获得更完整的协议概述,查看协议的Apple Docs 。

@属性(非primefaces,弱)ID委托;

没有特定types或协议实现的属性。 在delegate上调用方法时,任何事情都会发生 – 如果编译器能够看到某个方法存在,并且运行时会检查您是否在说谎,那么编译器会相信您。

@属性(非primefaces,弱)ID <协议名称>委托;

没有特定types的属性,但实现了指定的协议。 你只能从该协议中调用方法(除非你做了一些转换)。 任何设置为该属性的实例都必须符合该协议(或者,您需要进行一些转换)。

@属性(非primefaces,弱)UIViewController * <protocol_name>委托;

一个特定types的属性( UIViewController ),它实现了一个指定的协议。 你只能从该协议和UIViewController类中调用方法(除非你做了一些强制转换)。 任何设置为属性的实例必须符合协议,并且是UIViewController的子类(或者,您需要一些强制转换)。

在第一个例子中:

 @property (nonatomic, weak) id delegate; 

你创build一个types为id的属性,这个属性在名称 – 委托的目标c中是'any'types的。

第二个例子:

 @property (nonatomic, weak) id < protocol_name > delegate; 

您需要创build一个types为id的属性,并使用name – delegate符合protocol_name协议。

最后一个例子:

 @property (nonatomic, weak) UIViewController * < protocol_name > delegate; 

您需要创build一个types为UIViewController(指向UIViewController)的属性,该属性需要使用name – 委托符合protocol_name协议。