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
ios Block语法学习
最新推荐文章于 2024-08-18 22:44:29 发布