目录
1. block的循环引用是如何造成的?
2. 使用UIAnimation的block回调时,需不需要使用__weak避免循环引用?为什么?
3. block属性是否可以用strong修饰?
4. 什么场景下才需要对变量使用__block?
5. 运行以下GCD多线程代码,控制台将打印什么?
1. block的循环引用是如何造成的?
------------Light.h------------
#import <Foundation/Foundation.h>
@interface Light : NSObject
@property (nonatomic, copy) NSString *color;
@property (nonatomic, copy) void (^block)(void);
@end
------------Light.m------------
#import "Light.h"
@implementation Light
@end
------------main.m------------
#import "Light.h"
int main(int argc, char * argv[]) {
@autoreleasepool {
Light *loveLight = [Light alloc] init];
loveLight.color = @"green";
loveLight.block = ^{
NSLog(@"%@",loveLight.color);
};
loveLight.block();
}
}
复制代码
我们在上面的代码中创建了一个Light(光)类,并声明两个属性color(颜色)及block。然后我们实例化一个对象loveLight并对其属性赋值,实现并调用block,造成循环引用。 然后我们通过clang代码,了解这段代码内部的部分实现:
struct __main_block_impl_0 {
struct __block_impl impl;
struct __main_block_desc_0* Desc;
RMPerson *__strong person;
__main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, Light *__strong _loveLight, int flags=0) : loveLight(_loveLight) {
impl.isa = &_NSConcreteStackBlock;
impl.Flags = flags;
impl.FuncPtr = fp;
Desc = desc;
}
};
static void __main_block_func_0(struct __main_block_impl_0 *__cself) {
Light *__strong loveLight = __cself->loveLight; // bound by copy
NSLog((NSString *)&__NSConstantStringImpl__var_folders_5l_0xn052bn6dgb9z7pfk8bbg740000gn_T_main_d61985_mi_0,((int