请仔细看代码:
/*
1.Block对象通常会使用外部创建的其它变量(基本类型的变量,或者指向其他对象的指针)---》外部变量。
2.当执行block对象时,为了确保其下的外部变量能够始终存在,相应的block对象会捕获这些变量。
1)对基本类型的变量,捕获意味着程序会拷贝变量的值,并用Block对象内的局部变量保存。
2)对指针类型的变量,block对象会使用强引用。意味着block对象用到的对象,都会被保留。
*/
#import "ViewController.h"
@interface ViewController ()
@property(nonatomic,copy)NSString *name;
@property(nonatomic,assign)int age;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
self.name=@"gujinyue";
self.age=23;
/*
1.本控制器(self)创建一个Block,每次执行Block又都会打印本控制器(self).
也即本控制器有一个指向block对象的指针,而这个block又会捕获本控制器,即有一个指回本控制器的指针,这样就陷入强引用循环。
2.为了打破这个强引用循环,可以现在block对象外面声明一个__weak指针,然后将这个指针指向block对象使用的self,最后在block对象中使用这个新的指针。
*/
__weak ViewController *controller=self;
void(^myBlock)(void)=^(){
/*
1.现在这个block对self是弱引用,强引用循环打破了。但是由于是弱引用,所以self在执行的时候有可能被释放。
2.可以在block对象中创建一个对self的局部强引用
*/
//NSLog(@"%@ %d",controller.name,controller.age);
ViewController *innerVc=controller;//局部强引用
//注意不要直接存取实例变量,而是使用存取方法
NSLog(@"%@ %d",innerVc.name,innerVc.age);
};
myBlock();
}
@end