Block的使用

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中拷贝的变量等。

 

每天进步一点点......

posted on 2016-03-29 09:19  玉思盈蝶  阅读(183)  评论(0编辑  收藏  举报

导航