Block的引用情况
2019-08-29 本文已影响0人
南城同學
- 当block内部访问了对象类型的auto变量时:
MYBlock block;
{
// 默认是auto修饰
MYPerson *person = [[MYPerson alloc] init];
person.age = 10;
block = ^{
NSLog(@"---------%d", person.age);
};
}
NSLog(@"------");
-
如果block是在栈上的(访问了auto变量的block),将不会对
auto
变量产生强引用 ; -
如果block是在堆上(严格来说是栈上的block进行了copy操作,才变成了堆上的):
1.会调用block内部的copy
函数;
2.copy
函数内部会调用_Block_object_assign
函数;
3._Block_object_assign
函数会根据auto
变量的修饰符(__strong
、__weak
、__unsafe_unretained
)做出相应的操作,形成强引用(retain
)或者弱引用。 -
如果block从堆上移除:
1.会调用block内部的dispose
函数;
2.dispose
函数内部会调用_Block_object_dispose
函数;
3._Block_object_dispose
函数会自动释放引用的auto变量(release
)。