- 当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)。









网友评论