有人可以告诉我
之间的区别@property (nonatomic, weak) id delegate;
@property (nonatomic, weak) id <protocol_name> delegate;
@property (nonatomic, weak) UIViewController * <protocol_name> delegate;
答案 0 :(得分:31)
@property (nonatomic, weak) id delegate;
这指定当前类的对象具有可以是任何类型的委托。 weak
说明符对于委托对象是常见的,因为它意味着具有委托的对象不会增加委托的引用计数(在ARC中说&#34;保留对它的强引用&#34;) 。 weak
委托参考是标准做法。
@property (nonatomic, weak) id < protocol_name > delegate;
这一细节表明当前类的对象具有可以是任何类型(id)的委托,但必须符合protocol_name
协议。这特别有用,因为包含委托的类知道它可以发送给它的委托的特定消息和&#34;知道&#34;代表将回复他们。
@property (nonatomic, weak) UIViewController * < protocol_name > delegate;
除了委托必须是类UIViewController
的对象之外,这与第二个示例相同。在实践中,delegate
对象通常是id
类型,虽然这不是必需的 - 它只为程序员提供了更大的自由。
编辑:协议
我们假设您按如下方式声明一个类:
@interface MyObject : NSObject <MyDelegateProtocol>
// ...
@end
此声明中的<MyDelegateProtocol>
表示MyObject
实施MyDelegateProtocol
协议中定义的方法(即符合协议&#39;)。
协议定义(显然在类定义之前)可能如下所示:
@protocol MyDelegateProtocol <NSObject>
@required
- (void)method1;
- (void)method2;
@optional
- (void)method3;
@end
这意味着任何符合条件的对象都是符合要求的。 MyDelegateProtocol
协议必须实施名为-(void)method1
和-(void)method2
的方法。并且,可选,可以包含消息-(void)method3
的实现。
这对于委托对象来说是非常有用的信息(协议名称可以是任何东西,我只是包含“委托”这个词,以明确它被用作委托协议)。 / p>
如果另一个班级现在定义:
@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
不需要检查,因为这些方法是@required
协议定义,并且可以随时调用它们。
一个类一次也可以使用多个协议(例如<Proto1, Proto2, UITableViewDelegate>
) - 有关协议的更完整概述,请查看Apple Docs on protocols。
答案 1 :(得分:5)
@property(非原子,弱)id委托;
没有特定类型或协议实现的属性。在delegate
上调用方法时,任何事情都会发生 - 编译器会信任你,如果它可以看到某个方法存在,运行时会检查你是否在撒谎。
@property(非原子,弱)id&lt; protocol_name&gt;委派;
没有特定类型但实现指定协议的属性。您只能从该协议调用方法(除非您进行一些转换)。设置为属性的任何实例必须符合协议(或者,您需要一些转换)。
@property(非原子,弱)UIViewController *&lt; protocol_name&gt;委派;
具有特定类型(UIViewController
)且实现指定协议的属性。您只能从该协议和UIViewController
类调用方法(除非您进行一些转换)。设置为属性的任何实例都必须符合协议并且是UIViewController
的子类(或者,您需要一些转换)。
答案 2 :(得分:1)
在第一个例子中:
@property (nonatomic, weak) id delegate;
你创建了一个id类型的属性,它是带有name - delegate的目标c中的'any'类型。
第二个例子:
@property (nonatomic, weak) id < protocol_name > delegate;
你创建了一个id类型的属性,它需要符合protocol_name协议和name - delegate。
最后一个例子:
@property (nonatomic, weak) UIViewController * < protocol_name > delegate;
你创建了一个UIViewController类型的属性(指向UIViewController的指针),它需要符合protocol_name协议和name - delegate。