ios Block语法学习

extern int countGlobal;
static  int countStatic;
{
     int  localCounter = 42;
     __block char localCharacter;

     void(ˆaBlock)(void) = ˆ(void){
      ++ CounterGlobal;
      ++ CounterStatic;
     CounterGloal = localCounter;
	localCharacter = 'a';
    };
       ++localCounter;
       localCharacter = 'b';
       aBlock();
}

执行block就是调用一个以block自身作为参数的函数,这个函数对应着block的执行体


语法:

很多的时候可以将其看做一个语句块或者匿名函数来使用

block 可以作为函数的参数或者返回值,并且他的本身也可以带参数和返回值

int (ˆmyBlock)(int) = ˆ(int num){ return num * mutiplier ;  ;

ˆmyBlock 是变量名,ˆ表示这是个block

int 是myBlock的返回类型

int num 传递的参数

  }是block 体,里面是该block执行的语句

 oc中申明一个带有block参数的函数:

-(void)textF:(Bool(ˆ)(Id a, Id b)) bBlock;  和我们经常看到的animations很类似。

使用Block时的几个重要点:

1.block函数外的对象在block语句块内只有可读访问权限,而没有修改的权限

2.对外部对象进行__block申明 就可以解决1

3.各类型的变数和 block之间的互动。

例子:

Blocks可以访问局部变量,但是不能修改。
              int multiplier = 7;
     int (^myBlock)(int) = ^(int num) {
         multiplier ++;//编译报错
         return num * multiplier;
     };
如果要修改就要加关键字:__block
         __block int multiplier = 7;
     int (^myBlock)(int) = ^(int num) {
         multiplier ++;//这样就可以了
         return num * multiplier;
     };

block的类型用_NSConcreteStackBlock来表示,表明这个block位于栈中。同样地,还有_NSConcreteMallocBlock

_NSConcreteGlobalBlock

由于block也是NSObject,我们可以对其进行retain操作。不过在将block作为回调函数传递给底层框架时,底层框架需要对其copy一份。比方说,如果将回调block作为属性,不能用retain,而要用copy。我们通常会将block写在栈中,而需要回调时,往往回调block已经不在栈中了,使用copy属性可以将block放到堆中。或者使用Block_copy()和Block_release()。


想进步理解block的话参考下面的博客:

http://blog.csdn.net/jasonblog/article/details/7756763#t0





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值