1.block的原型及定义:
NSString * ( ^ myBlock )( int );
myBlock = ^( int paramA ) { return [ NSString stringWithFormat: @"Passed number: %i", paramA ]; };
myBlock(7);
2.
Block作为函数参数: 1 // .h 2 -(void) testBlock:( NSString * ( ^ )( int ) )myBlock; 3 // .m 4 -(void) testBlock:( NSString * ( ^ )( int ) )myBlock 5 { 6 NSLog(@"Block returned: %@", myBlock(7) ); 7 }
3.block中改变变量的值:
__block int x;
对于用__block修饰的外部变量引用,block是复制其引用地址来实现访问的.
4.编译器如何编译:
#import typedef void(^BlockA)(void); __attribute__((noinline)) void runBlockA(BlockA block) { block(); } void doBlockA() { BlockA block = ^{ // Empty block }; runBlockA(block); }
定义了一个名为BlockA的block类型,该block在函数doBlockA中实现,并将其作为函数runBlockA的参数,最后在函数doBlockA中调用函数runBloackA。
注意:
如果block的创建和调用都在一个函数里面,那么优化器(optimiser)可能会对代码做优化处理,从而导致我们看不到编译器中的一些操作,所以用__attribute__((noinline))给函数runBlockA添加noinline,这样优化器就不会在doBlockA函数中对runBlockA的调用做内联优化处理。
5. copy()和dispose():
如果我们想要在以后继续使用某个block,就必须要对该block进行拷贝操作,即从栈空间复制到堆空间。所以拷贝操作就需要调用Block_copy()函数,block的descriptor中有一个copy()辅助函数,该函数在Block_copy()中执行,用于当block需要拷贝对象的时候,拷贝辅助函数会retain住已经拷贝的对象。
既然有有copy那么就应该有release,与Block_copy()对应的函数是Block_release(),它的作用不言而喻,就是释放我们不需要再使用的block,block的descriptor中有一个dispose()辅助函数,该函数在Block_release()中执行,负责做和copy()辅助函数相反的操作,例如释放掉所有在block中拷贝的变量等。
每天进步一点点......