代表们如何工作并将工作流程委托给客户-c

Fer*_*yan -2 delegates objective-c ios

我是Objective-c的新手.我正在学习目标-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
Run Code Online (Sandbox Code Playgroud)

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

#import "SampleProtocol.h"

@implementation SampleProtocol

-(void)startSampleProcess{

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

IBOutlet为标签创建一个并将其命名为myLabel并更新代码,如下所示采用SampleProtocolDelegateViewController.h

#import <UIKit/UIKit.h>
#import "SampleProtocol.h"

@interface ViewController : UIViewController<SampleProtocolDelegate>
{
    IBOutlet UILabel *myLabel;
}
@end
Run Code Online (Sandbox Code Playgroud)

和更新的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
Run Code Online (Sandbox Code Playgroud)

小智 5

首先,我要指出,当您用于@property声明属性时,不需要使用下划线前缀创建单独的实例变量.您可以使用self.delegate它来访问此属性,它也会自动_delegate为您创建.因为_delegate已经使用@property你创建了可以取出重复声明.

其次,您可以移动<SampleProtocolDelegate>到属性声明,您还应该将其设置为弱以避免保留周期.请参阅:为什么使用弱指针进行委派?.所以你的界面最终看起来像这样:

@interface SampleProtocol : NSObject

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

-(void)startSampleProcess;

@end
Run Code Online (Sandbox Code Playgroud)

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