objective-c 中代表的工作方式和代表工作流程

how delegates works and delegates work flow in objective-c

我是Objective-c的新手。我正在学习 objective-c 。你能告诉我这段代码是如何工作的吗?你能帮助我理解 objective-c

中的代表工作流程吗?
SampleProtocol.h
#import <Foundation/Foundation.h>

@protocol SampleProtocolDelegate <NSObject>
@required
- (void) processCompleted;
@end

@interface SampleProtocol : NSObject

{

   id <SampleProtocolDelegate> _delegate; 

}
@property (nonatomic,strong) id delegate;

-(void)startSampleProcess;  

@end

在我添加 SampleProtocol.m 下面的代码

之后
#import "SampleProtocol.h"

@implementation SampleProtocol

-(void)startSampleProcess{

    [NSTimer scheduledTimerWithTimeInterval:3.0 target:self.delegate 
    selector:@selector(processCompleted) userInfo:nil repeats:NO];
}
@end

为标签创建一个IBOutlet并将其命名为myLabel并更新代码如下以在ViewController.h

中采用SampleProtocolDelegate
#import <UIKit/UIKit.h>
#import "SampleProtocol.h"

@interface ViewController : UIViewController<SampleProtocolDelegate>
{
    IBOutlet UILabel *myLabel;
}
@end

更新后的ViewController.m文件如下

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    SampleProtocol *sampleProtocol = [[SampleProtocol alloc]init];
    sampleProtocol.delegate = self;
    [myLabel setText:@"Processing..."];
    [sampleProtocol startSampleProcess];

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];

}

#pragma mark - Sample protocol delegate
-(void)processCompleted{    
    [myLabel setText:@"Process Completed"];
}


@end

首先让我指出,当您使用@property声明一个属性时,您不需要创建一个带有下划线前缀的单独的实例变量。您可以使用 self.delegate 访问此 属性,它还会自动为您创建 _delegate。因为 _delegate 已经使用 @property 创建,所以您可以删除重复的声明。

其次,你可以将<SampleProtocolDelegate>移动到属性声明,你也应该将它设置为weak以避免循环引用。参见:Why use weak pointer for delegation?。所以你的界面最终会看起来像这样:

@interface SampleProtocol : NSObject

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

-(void)startSampleProcess;

@end

通过将 <SampleProtocolDelegate> 放在 'id' 和 'delegate' 之间, 只有符合 SampleProtocolDelegate 的对象才能将自己设置为对象的委托(意思是:任何符合此协议的对象)。并且 SampleProtocol 对象可以安全地假定它可以调用其委托上的协议方法。

委派是开发人员武器库中的一个强大工具,我认为委派是连接 object 并帮助他们与其他人交流的一种简洁明了的方式。换句话说,委派是 Objective-C objects.Let 的约会服务,假设我们有两个 object,Brain 和 Beer Bottle,Brain 是我们用来管理的 object整个 Body 应用程序,它处理所有重要任务,如便便、吃饭、喝水、睡觉等。啤酒瓶附加到 body 但它不知道 Brain 在想什么,同样,大脑不知道啤酒瓶在想什么。

大脑在看电视的时候利用啤酒瓶的属性来满足自己,但问题是大脑被电视分心了,以至于无法注意啤酒什么时候会运行出来.这一切都可能以灾难告终,Brain 需要知道啤酒什么时候空了,以便它发送 body 到冰箱并初始化啤酒瓶的另一个实例。

Brain 可以使用 drink 函数来降低 Beer Bottles 的 liquid 变量,但是一旦 liquid 达到 0,Brain 需要知道它,这就是代表开始行动的地方,我们可以使用 Beer Bottle Delegate。 Brain 可以监听 Beer Bottle Delegate 告诉 Brain 瓶子是空的,我们需要做的只是告诉 Brain 监听 Beer Bottle 告诉它的 Delegate 是空的,Brain 可以对此做出反应。这张经过深思熟虑并配有插图的图表展示了所有这一切的实际效果