首页 > 学院 > 开发设计 > 正文

iOS之单例,代理,通知,KVO,Block全能解析

2019-11-14 18:32:44
字体:
来源:转载
供稿:网友
//单例//.h+ (Instannce *)shareInstance;//.mstatic 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;//.mif ([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的赋值 实现

 


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表