由ReactiveCocoa想到的@strongify以及@weakify宏命令的使用

首先理解MRC(MannulReference Counting)与ARC(Automatic Reference Counting),分别提供对内存的手动和自动管理,Xcode 4.1及其以前版本没有ARC。

 @weakify(self);
    [vcmodel.successSubject subscribeNext:^(NSArray * x) {
        @strongify(self);
        LoginWinViewController *vc = [[LoginWinViewController alloc]init];
        [self presentViewController:vc animated:YES completion:^{
            NSLog(@"登陆成功:%@",x);
        }];
    }];

原生代码是

__weak typeof(self) weakSelf = self;
 [RACObserve(self, name) subscribeNext:^(NSString*name) {
        __strong typeof(weakSelf) strongSelf = weakSelf;
        weakSelf.outputLabel.text = name;
    }];

一般主要是在block中使用主要是为了解决 retain circle

Apple 官方的建议是,传进 Block 之前,把 ‘self’ 转换成 weak automatic 的变量,这样在 Block 中就不会出现对 self 的强引用。如果在 Block 执行完成之前,self 被释放了,weakSelf 也会变为 nil。

因为block一般都在对象内部声明.. 如果在block内部使用了当前对象的属性,就会造成循环引用(block拥有当前对象的地址,而当前对象拥有block的地址),而引起内存泄露,block和当前对象都无法释放.
@weakify 将当前对象声明为weak.. 这样block内部引用当前对象,就不会造成引用计数+1可以破解循环引用
@strongify 相当于声明一个局部的strong对象,等于当前对象.可以保证block调用的时候,内部的对象不会释放

大概相当于

 __weak __typeof(self)weakSelf = self;
 block = ^(){
      __strong __typeof(weakSelf)strongSelf = weakSelf; 
     // strongSelf.property
 };
由ReactiveCocoa想到的@strongify以及@weakify宏命令的使用_第1张图片

一盏灯, 一片昏黄; 一, 一杯淡茶。 守着那一份淡定, 品读属于自己的寂寞。 保持淡定, 才能欣赏到最美丽的风景! 保持淡定, 人生从此不再寂寞。

你可能感兴趣的:(由ReactiveCocoa想到的@strongify以及@weakify宏命令的使用)