目标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
对象通常是id
types的,尽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协议。