谁能告诉我这两者的区别
@property (nonatomic, weak) id delegate;
@property (nonatomic, weak) id <protocol_name> delegate;
@property (nonatomic, weak) UIViewController * <protocol_name> delegate;
最佳答案
@property (nonatomic, weak) id delegate;
这指定当前类的对象有一个可以是任何类型的委托(delegate)。 weak
说明符对于委托(delegate)对象很常见,因为它意味着具有委托(delegate)的对象不会增加委托(delegate)的引用计数(在 ARC 中“保持对它的强引用”)。 weak
委托(delegate)引用是标准做法。
@property (nonatomic, weak) id < protocol_name > delegate;
这具体说明当前类的对象有一个可以是任何类型 (id) 的委托(delegate),但必须符合 protocol_name
协议(protocol)。这是特别有用的,因为包含委托(delegate)的类知道它可以发送给它的委托(delegate)的特定消息并且“知道”委托(delegate)将响应它们。
@property (nonatomic, weak) UIViewController * < protocol_name > delegate;
这与第二个示例相同,只是委托(delegate)必须是类 UIViewController
的对象。 .在实践中,delegate
对象通常是 id
类型,虽然这不是必需的 - 它只是为程序员提供了更大的自由。
编辑:协议(protocol)
假设您声明一个类如下:
@interface MyObject : NSObject <MyDelegateProtocol>
// ...
@end
<MyDelegateProtocol>
在此声明中表示 MyObject
实现 MyDelegateProtocol
中定义的方法协议(protocol)(即“符合协议(protocol)”)。
协议(protocol)定义(显然在类定义之前)可能如下所示:
@protocol MyDelegateProtocol <NSObject>
@required
- (void)method1;
- (void)method2;
@optional
- (void)method3;
@end
这意味着任何“符合”MyDelegateProtocol
的对象协议(protocol)必须实现名为-(void)method1
的方法和 -(void)method2
.并且,可选,可以包括消息 -(void)method3
的实现。 .
这对于委托(delegate)对象来说是非常有用的信息(顺便说一句,协议(protocol)名称可以是任何东西,我只是包含“委托(delegate)”一词以明确表示它用作委托(delegate)协议(protocol))。
如果另一个类现在定义:
@property (nonatomic, weak) id<MyDelegateProtocol> delegate;
该类知道它可以依赖 -method1
的实现和 -method2
由其委托(delegate)实现,并且-method3
也可以实现(它可以用如下代码检查:)
if ([self.delegate respondsToSelector:@selector(method3)]) {
[self.delegate method3];
}
else {
// Delegate doesn't implement -method3.
}
-method1
不需要检查和 -method2
因为这些方法是 @required
根据协议(protocol)定义,它可以随时调用它们。
一个类也可以一次使用多个协议(protocol)(例如 <Proto1, Proto2, UITableViewDelegate>
)- 如需更完整的协议(protocol)概述,请查看 Apple Docs on protocols .
关于ios - Objective-C 委托(delegate)声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23106556/