知识点积累

__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可以作为参数.

如图这样就会报错:

你可能感兴趣的:(知识点积累)