本文的主要内容涉及block的含义,完整的表达式,截获自动变量值,截获自动变量,内存管理以及避免循环引用,另附上2个习题。
1、block的含义:
带有自动变量的匿名函数,这个自动变量就相对于Objective-C对象的成员变量。
2、block完整的表达式:
^ 返回值类型 参数列表 {}
3、block是如何截获自动变量值的?
执行block语法时,block表达式中所使用的自动变量值被保存到Block结构体实例中。
4、block截获自动变量
截获的自动变量没有__block修饰符,可以使用但是不能赋值,只有采用__block修饰符的自动变量才能进行赋值操作。 block不能截获C语言的数组。
5、block的内存管理
block中若没有截获自动变量,那么block创建之初内存分配在数据区(_NSConcreteGlobalBlock),若block中截获了自动变量,block创建之初内存分配在栈上(_NSConcreteStackBlock),通过copy方法可以将block从栈上复制到堆上(_NSConcreteMallocBlock)。
在ARC下,下面情况不需要手动执行copy方法:
a、block作为函数返回值
b、block作为成员变量
c、方法名中含有usingBlock的cocoa系统方法以及GCD中的block
6、使用__weak避免block的循环引用
Question:
1、在block中使用类的成员变量为什么成员变量不需要加__block?
C语言中允许Block改写静态变量(静态局部变量),静态全局变量以及全局变量的值。
2、下面两段代码的输出结果分别是?
代码1:
NSString *name =@"lh";
void(^nameBlock)(void) = ^ {
NSLog(@"name:%@",name);
};
name =@"xll";
nameBlock();
代码2:
__block NSString *name =@"lh";
void(^nameBlock)(void) = ^ {
NSLog(@"name:%@",name);
};
name =@"xll";
nameBlock();
输出结果:代码1输出lh,代码2输出xll
网友评论