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 可以对此做出反应。这张经过深思熟虑并配有插图的图表展示了所有这一切的实际效果
我是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
#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 可以对此做出反应。这张经过深思熟虑并配有插图的图表展示了所有这一切的实际效果