首先理解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
};
一盏灯, 一片昏黄; 一简书, 一杯淡茶。 守着那一份淡定, 品读属于自己的寂寞。 保持淡定, 才能欣赏到最美丽的风景! 保持淡定, 人生从此不再寂寞。