__block的作用和用途:
作用:
在Block使用中,Block内部能够读取外部局部变量的值。但我们需要改变这个变量的值时,需要给它附加上__block修饰符。
使用场景:
为了避免某些情况下Block循环引用的问题,我们也可以给相应对象加上__block 修饰符。
问题1:在block里面, 对数组执行添加操作, 这个数组需要声明成 __block吗?
不需要声明成__block,因为testArr数组的指针并没有变(往数组里面添加对象,指针是没变的,只是指针指向的内存里面的内容变了)
问题2:在block里面, 对NSInteger进行修改, 这个NSInteger是否需要声明成__blcok ?
NSInteger的值发生改变,则要求添加__block修饰
NSMutableArray *testArr =[[NSMutableArray alloc] initWithObjects:@"1",@"2", nil];
__block NSInteger a=10;
/**结论:在block里面修改局部变量的值都要用__block修饰**/
void (^TestBlock)(void) = ^{
// NSMutableArray *temArr=[[NSMutableArray alloc] init];
// testArr=temArr;//testArr数组的指针发生改变时,testArr要添加__block修饰
a=100;//a的值发生改变,则要求添加__block修饰
// testArr不需要声明成__block,因为testArr数组的指针并没有变(往数组里面添加对象,指针是没变的,只是指针指向的内存里面的内容变了)
[testArr addObject:[NSString stringWithFormat:@"3"]];
NSLog(@"_block testArr :%@ a:%d", testArr,a);
};
a=0;
TestBlock();
NSLog(@"testArr :%@ a:%d", testArr,a);
运行结果:
2015-05-13 20:16:23.862 WXMovie_study[22827:1683307] _block testArr :(
1,
2,
3
) a:100
2015-05-13 20:16:23.862 WXMovie_study[22827:1683307] testArr :(
1,
2,
3
) a:100
id 和 instancetype的区别
id 和 instancetype 都是关键字,表示某个方法返回的未知类型的OC对象
不同 :
在ARC环境下:instancetype用来在编译期确定实例的类型,而使用id的话,编译器不检查类型, 运行时检查类型.
在MRC环境下:instancetype和id一样,不做具体类型检查
1:instancetype 关联返回类型 1.类方法中,以alloc或new开头;2.实例方法中,以autorelease,init,retain或self开头;将会返回一个方法所在类类型的对象,这些方法就被称为关联返回类型的方法。换句话说,这些方法的返回结果以方法所在的类为类型。
但是id只能返回未知类型的对象。
2:instancetype只能作为返回值,id可以作为参数.
如图这样就会报错: