首先理解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
};
一盞燈, 一片昏黃; 一簡書, 一杯淡茶。 守著那一份淡定, 品讀屬于自己的寂寞。 保持淡定, 才能欣賞到最美麗的風景! 保持淡定, 人生從此不再寂寞。