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

时间:2022-08-30 14:48:48
//单例
//.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的赋值 实现