美文网首页iOS
blok,代理,通知区别 和传递回调参数,解释“一对一”和“一对

blok,代理,通知区别 和传递回调参数,解释“一对一”和“一对

作者: 若风_412d | 来源:发表于2019-03-19 21:07 被阅读43次

    1.blok为什么用copy,代理为什么用week

    blok
    copy可以把bolk放在堆区,防止传递的参数值放在栈区被系统清掉;
    代理
    week,:类。delegate=self。是强引用;
    修饰也用strong 是强引用;
    两个强引用造成循环引用;

    参考下文
    https://www.jianshu.com/p/64125b5617a4
    https://www.jianshu.com/p/398472616435

    2.原理

    代理是方法的变种,逻辑没变,物理位置变化,;blok比代理多了retun多个结果。

    3.blok,代理,通知区别 和传递参数

    3.1通知

    运行机制:

    如果注册监听的代码放开发送通知之后执行,侧无法接收到通知。

    也就是说:在postNotificationName这句代码执行的时候,在它执行代码之前,所有执行了addObserver的地方会收到通知(《代码逻辑顺序1.1和1.2》),其他地方(《代码逻辑顺序4》)收不到;无论写到哪个控制器里。

    一对多:

    只要通知发送了,接收的地方(都是在发通知之前执行的)不管有几个地方接收(好比:i = 10 , j=i 所以 i= 10 ,j =10),都会一一执行。

    //注册监听第一个控制器,接收通知
    //代码逻辑顺序1.1
    [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(firsr)
                                                     name: @"Notification_Send_Message"
                                                   object:nil];//这个object 就是传参数用的
    //注册监听第二个控制器
    //代码执行顺序1.2
    [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(secend)
                                                     name: @"Notification_Send_Message"
                                                   object:nil];
    
    //代码执行顺序2 发送通知
     [[NSNotificationCenter defaultCenter] postNotificationName:@"Notification_Send_Message" object:m_dic];
    //代码逻辑顺序4
    [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(xxxxx)
                                                     name: @"Notification_Send_Message"
                                                   object:nil];//这个object 就是传参数用的
    
    //上 面的代码发送通一旦执行 下面两个方法都会执行
    - (viod)firsr{//代码执行顺序3.1
    }
    - (viod) secend{//代码执行顺序3.2
    }
    - (viod) xxxx{//不会被执行
    }
    
    
    //注销监听 跟注册监听写在一个控制器里面
    - (void)viewWillDisappear:(BOOL)animated{//逻辑顺序5
    [[NSNotificationCenter defaultCenter]removeObserver:selfname:@"Notification_Send_Message"object:nil];
    }
    
    
    

    3.2block

    一对一:

    如果两个接收信息代码都运行了(就是下面的《代码执行顺序2》) ,那么下一次信息发送只有一个接收的地方,就是最后一次接收信息的代码那里,前一个接收信息的代码被覆盖了(i = 10 , i= 20,那结果就是i= 20).

    但是仍然可以在多个控制器接收,下面是两个控制器都需要回调另一个一个控制器的值,用block 做回调的方法;

    运行机制:和通知一样

    如果《代码执行顺序3》放在《代码执行顺序2》的前面执行,侧无法接收到回调。

    //值传出去

    #import <UIKit/UIKit.h>
    
    NS_ASSUME_NONNULL_BEGIN
    typedef void(^ShowTextBlock)(NSString *text);
    @interface TextFieldCommViewController : UIViewController
    
    //代码执行顺序1 定义
    @property(nonatomic,copy) ShowTextBlock showTextBlock;
    
    @end
    
    NS_ASSUME_NONNULL_END
    

    //值传出的地方

    #import "TextFieldCommViewController.h"
    
    @interface TextFieldCommViewController ()
    
    @end
    
    @implementation TextFieldCommViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    }
    //点击返回
    -(void)complete{
     //代码执行顺序3
            _showTextBlock(_backTextField.text);
            [self.navigationController popViewControllerAnimated:YES];
    
        }
    

    //第一个参数接收的地方:接收传递的参数

    @implementation aaaaTableViewController
    
    
    - (IBAction)eventName:(id)sender {
        
        UIStoryboard *sb = [UIStoryboard storyboardWithName:@"xxxx" bundle:nil];
        TextFieldCommViewController * refundVC = [sb instantiateViewControllerWithIdentifier:@"TextFieldCommViewController"];
    //代码执行顺序2 refundVC.showTextBlock 大括号外的
        refundVC.showTextBlock = ^(NSString *text){
            //代码执行顺序4 大括号内的
    
        };
        [self.navigationController pushViewController:refundVC animated:YES];
    }
    

    //第二个参数接收的地方:接收传递的参数

    @implementation bbbbbTableViewController
    
    
    - (IBAction)eventName:(id)sender {
        
        UIStoryboard *sb = [UIStoryboard storyboardWithName:@"xxxx" bundle:nil];
        TextFieldCommViewController * refundVC = [sb instantiateViewControllerWithIdentifier:@"TextFieldCommViewController"];
    //逻辑运行2 refundVC.showTextBlock 大括号外的
        refundVC.showTextBlock = ^(NSString *text){
            //逻辑运行4 大括号内的
    
        };
        [self.navigationController pushViewController:refundVC animated:YES];
    }
    

    4代理

    运行机制:和通知一样

    一对一 和block 一样

    代理和block几乎一样
    //传递数据的地方

    #import <UIKit/UIKit.h>
    
    
    //代码执行顺序1 定义
    @protocol scroViewDelegate <NSObject>
    - (void)didleftScroll:(NSString*)strrr;
    @end
    
    @interface ORChartView : UIView
    //代码执行顺序1 定义
    @property (nonatomic, weak) id <scroViewDelegate> delegate;
    

    2.接收值的地方

    #import "NewHomeTableViewController.h"
    #import "ORChartView.h"
    @interface NewHomeTableViewController ()<scroViewDelegate>
    @property (nonatomic, strong) ORChartView *chartView;
    @end
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
     _chartView = [[ORChartView alloc]init];
                        _chartView.delegate=self;////代码执行顺序2
    }
    

    3.传递数据的地方

    //代码执行顺序3
     if ([self.delegate respondsToSelector:@selector(didleftScroll:)])
                
            {
                [self.delegate didleftScroll :@"sssss"];
            }
    

    4.接收数据的地方

    
    #pragma mark  代理
    - (void)didleftScroll:(NSString*) strrr{//代码执行顺序4
    
        
    }
    

    block 是把代理,接收方的代码整合在一起了

    相关文章

      网友评论

        本文标题:blok,代理,通知区别 和传递回调参数,解释“一对一”和“一对

        本文链接:https://www.haomeiwen.com/subject/dfkomqtx.html