ios - Objective-C 委托(delegate)声明

标签 ios objective-c delegates

谁能告诉我这两者的区别

@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/

相关文章:

iphone - 如何通过手势更改引号

iphone app允许背景音乐继续播放

iphone - 将 UIViewController xib 加载到 Storyboard 中的 ContainerView

c# - 对于链式异步/事件调用是否有有用的设计模式?

c# - 为什么委托(delegate)类型派生自 MulticastDelegate 类为什么不直接派生自 Delegate 类?

ios - 委托(delegate)和回调不适用于传递模型数据

ios - 启动屏幕 Storyboard未显示我的图像

objective-c - 将 MFMailComposeViewController 推送到导航堆栈?未模态呈现

jquery <video> .play 无法在移动设备上运行

objective-c - 如何消除在 Cocoa 中打开 xml 文件时出现的错误