【block第二篇】对象类型auto变量的Capture
2018-12-28 本文已影响3人
xxxxxxxxx_ios
1.栈上block
将不会对auto变量产生强引用,因为block自己都会随时被回收,所以不会对auto对象产生引用。
- 代码
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "YMPerson.h"
int main(int argc, char * argv[]) {
@autoreleasepool {
{
YMPerson *person = [[YMPerson alloc] init];
person.age = 10;
// 此block为栈区block 不会对person对象产生引用。
^ {
NSLog(@"age == %d",person.age);
};
}
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
2.堆上block(NSStackBlock调用copy)
会调用block内部的copy函数,copy函数内部会调用_Block_object_assign函数, _Block_object_assign函数会根据auto变量的修饰符(__strong、__weak、__unsafe_unretained)做出相应的操作,形成强引用(retain)或者弱引用.
- 代码
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import "YMPerson.h"
typedef void(^YMBlock)(void);
int main(int argc, char * argv[]) {
@autoreleasepool {
YMBlock block;
{
YMPerson *person = [[YMPerson alloc] init];
person.age = 10;
// 此block有强指针引用,会堆区block,所以会对其中的person对象有一个强引用(person对象默认为__strong类型),当用__weak、__unsafe_unretained修饰时,会对应的为弱引用
block = ^ {
NSLog(@"age = %d",person.age);
};
}
NSLog(@"%@",[block class]);
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
3.block从堆空间移除
会调用block内部的dispose函数,dispose函数内部会调用_Block_object_dispose函数, _Block_object_dispose函数会自动释放引用的auto变量(release).