zoukankan      html  css  js  c++  java
  • iOS 之单例,代理,通知,KVO,Block全能解析

    //单例
    //.h
    + (Instannce *)shareInstance;
    //.m
    static Instannce *instance = nil;
    @implementation Instannce
    //定义一个创建单例对象的方法
    + (Instannce *)shareInstance {
        if (instance == nil) {
            instance = [[Instannce alloc] init];
        }   
        return instance;
    }
    //使用alloc的时候调用的方法instancetype
    + (id)allocWithZone:(struct _NSZone *)zone {
        if (instance == nil) {
            instance = [super allocWithZone:zone];
        }  
        return instance;
    }
    - (id)copy {
        return self;
    }
    - (id)retain {
        return self;
    }
    - (NSUInteger)retainCount {
        //返回无符号最大值
        return UINT_MAX;
    }
    - (oneway void)release {
        //什么也不做
    }
    
    //代理
    //.h
    @protocol GetMessageProtocol <NSObject >
    - (void)getNum:(NSString *)num withPassWord:(NSString *)pass;
    @end
    @property (nonatomic,assign) id<GetMessageProtocol> delegate;
    //.m
    if ([self.delegate respondsToSelector:@selector(getNum:withPassWord:)]) {
            [self.delegate getNum:num.text withPassWord:passWord.text];
        }
    #pragma mark - GetMessageProtocol
    - (void)getNum:(NSString *)num withPassWord:(NSString *)pass {
        
    }
    registerCtrl.delegate = self;
    
    //通知 注意postNotificationName 必须一致
        [[NSNotificationCenter defaultCenter] postNotificationName:NotificationName object:self userInfo:dic];  //dic存放在userinfo中   dic中存放要传过去的值是个字典
    //接受通知
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeAction:) name:NotificationName object:nil];
    
    //KVO监听
    /*KVO观察者方法
     keyPath: 监听的属性名
     object: 被观察的对象
     change: 属性值
     context: 上下设备文
     */
        [registerCtrl addObserver:self forKeyPath:@"属性名称1" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];
        [registerCtrl addObserver:self forKeyPath:@"属性名称2" options:NSKeyValueObservingOptionNew context:nil];
    //触发的事件
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
        //object的值是registerCtrl
        if ([keyPath isEqualToString:@"属性名称1"]) {
           
        }else if ([keyPath isEqualToString:@"属性名称2"]) {
            
        }  
    }
    //.h
    @property (nonatomic, copy) NSString *属性名称1;
    @property (nonatomic, copy) NSString *属性名称2;
    //.m   必须通过setter方法改变值或者KVC
    
    //KVO方式
    //触发的事件
    [indexCollectionView addObserver:self forKeyPath:@"属性名称" options:NSKeyValueObservingOptionNew context:nil];
            [posterCollectionView addObserver:self forKeyPath:@"pathIndex" options:NSKeyValueObservingOptionNew context:nil];
    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
        //得到改变后的新值
        NSInteger index = [[change objectForKey:@"new"] integerValue];
    
        }
    }
    
    //Block  block的返回值  block的名称    block的参数
        typedef void(^SucccessBlock)(NSString *); //Block的定义
    @property(nonatomic,copy)SucccessBlock loginBlock;  //block的声明  要用copy防止block的循环引用
    _freindBlcok(friends); block的调用
    [[MyXMPPManager shareManager] getFreind:^(NSArray *freinds) {}   //block的赋值 实现
  • 相关阅读:
    @configuration 和 @bean
    js中关键字 const , let , var 的用法区别
    springboot+vue项目demo地址
    快速开发框架下载地址(github)
    搭建vue项目并启动vue项目
    export default{} 和 new Vue()都是什么意思
    反向代理
    [转]python类方法
    linux中waitpid及wait的用法
    mount
  • 原文地址:https://www.cnblogs.com/sunjiachen/p/4724093.html
Copyright © 2011-2022 走看看