1.data source也是一种特殊的delegate,data source负责传输数据给View例如data、at、count等,而delegate负责处理View的did、should、will等问题,View把需要的数据信息或者事件信息传输给dalegate,dalegate则负责回复这些信息。
2.Block当中不能修改局部变量的值,在block中,局部变量都是只读的,比如在block外部有一个BOOL value = YES;,如果在block内部修改value的值,这就是非法的,编译器会报错。当然,有一种办法可以进行读写,就是在变量前面加上两个下划线和block,如:__block BOOL value = YES;,这样就可以在block当中进行该变量的读写了。
原理是如果声名了__block,编译器就会生成一段代码将value从栈(stack)移到堆中(heap),同时编译器会有一个强指针指向block中的每一个变量,确保它不会在block执行完毕前就离开堆,当执行完block的时候,编译器将信息拷贝回堆当中,然后再移回栈当中,同时强指针会在block goes out of scope*1之前一直存在。
3.如果block不需要参数,参数的括号可以直接省去,如果返回值再return的时候可以直接看出来,比如return [MyClass isKindOfClass:...];,这种类型的编译器会自动完成返回值,所以block的返回值类型也可以省去。
突然感觉学的好像有点快了,开始回头看以前知识的详细解释。
*1:英语不是很好,我的理解是block也是有作用域的,比如[UIView animateWithDuration:NSTimeInterval animations:^(void)animations]这个方法,再执行完该方法的时候可能block就已经失效了,block的作用与就是这一条语句,当然这是我的猜测,如有了解的请务必纠正我。