目标C代表声明

Pre*_*iga 16 delegates objective-c ios

有人可以告诉我两者之间的区别

@property (nonatomic, weak) id delegate;

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

@property (nonatomic, weak) UIViewController * <protocol_name> delegate;
Run Code Online (Sandbox Code Playgroud)

Eph*_*era 32

@property (nonatomic, weak) id delegate;

这指定当前类的对象具有可以是任何类型的委托.该weak说明符是委托对象常见的,因为这意味着与委托不增加委托的引用计数的对象(ARC-讲"保持它的一个有力的参考").甲weak代表参考是标准做法.

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

这一细节表明当前类的对象具有可以是任何类型(id)但必须符合protocol_name协议的委托.这特别有用,因为包含委托的类知道它可以发送给其委托的特定消息并"知道"委托将响应它们.

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

这与第二个示例相同,只是委托必须是类的对象UIViewController.在实践中,delegate对象通常是类型的id,虽然这不是必需的 - 它只是为程序员提供了更大的自由.


编辑:协议

假设你声明一个类如下:

@interface MyObject : NSObject <MyDelegateProtocol>
// ...
@end
Run Code Online (Sandbox Code Playgroud)

<MyDelegateProtocol>本声明意味着,MyObject实现在中定义的方法MyDelegateProtocol的协议(即"符合协议").

协议定义(显然在类定义之前)可能如下所示:

@protocol MyDelegateProtocol <NSObject>
@required
- (void)method1;
- (void)method2;
@optional
- (void)method3;
@end
Run Code Online (Sandbox Code Playgroud)

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

这对于委托对象来说是非常有用的信息(顺便说一句,协议名称可以是任何东西,我只是包含"委托"一词,以明确它被用作委托协议).

如果另一个类现在定义:

@property (nonatomic, weak) id<MyDelegateProtocol> delegate;
Run Code Online (Sandbox Code Playgroud)

该类知道它可以依赖其委托的实现-method1-method2实现,-method3 可以实现(它可以使用以下代码检查:)

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

检查是不必要的,-method1并且-method2因为这些方法是@required通过协议定义,并且它可以随时调用它们.

一个类也可以一次使用多个协议(例如<Proto1, Proto2, UITableViewDelegate>) - 有关协议的更完整概述,请查看Apple Docs on protocols.


Wai*_*ain 5

@property(非原子,弱)id委托;

没有特定类型或协议实现的属性.当调用方法时delegate,任何事情都会发生 - 编译器会信任你,如果它可以看到方法存在于某个地方,运行时将检查你是否在撒谎.

@property(非原子,弱)id <protocol_name>委托;

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

@property(非原子,弱)UIViewController*<protocol_name>委托;

具有特定type(UIViewController)并实现指定协议的属性.您只能从该协议和UIViewController类中调用方法(除非您进行一些转换).设置为属性的任何实例必须符合协议并且是子类UIViewController(或者,您需要一些转换).