oc中block的理解

本文详细介绍了Objective-C中的Block概念,包括其语法特性、如何声明Block、Block如何访问外部变量等,并探讨了Block与函数指针的区别及联系。

block可能是我在学习objective-c语法中遇到的第一个puzzle的地方。确实,这个语法takes some getting use to.

block实际是一种闭包,它是oc中对闭包的实现。闭包是什么?清楚地记得这个是我去年在参加鹅厂的实习笔试的时候的一个大题,记得没错是第二个大题。anyway,跑题了。。。

我是通过c中的函数指针的方式去理解block的。毕竟两个概念写起来太像了。例如一个ptr函数指针的声明:

int (*ptr)(int*, float);



相应的block可以这么声明:

int (^bptr)(int*, float);


block需要使用符号^声明,^读作caret,看几个block的例子:

int main(int args, char *argv[]) {
<span style="white-space:pre">	</span>@autoreleasepool {
<span style="white-space:pre">		</span>void ^(showMessage)(void) = ^(void) {
<span style="white-space:pre">			</span>NSLog("hehe");
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>showMessage();
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>return 0;
}


block可以访问block外部的成员,拿到block定义的时候成员的值,注意下面showMessge()输出3,而不是7:

int main(int args, char *argv[]) {
<span>	</span>@autoreleasepool {
<span style="white-space:pre">		</span>int val = 3;
<span>		</span>void ^(showMessage)(void) = ^(void) {
<span>			</span>NSLog(@"val =%i", val);
<span>		</span>}
<span style="white-space:pre">		</span>val = 7;
<span style="white-space:pre">		</span>showMessage();
<span>	</span>}
<span>	</span>return 0;
}
通常情况下,编译器是不允许在block内部修改block外部的成员值。在block内部看来,外部的成员对它而已是read-only的。


跟函数指针类似,block的一个作用是作为函数或者方法的参数。除此之外,block还有一个作用:它可以被系统分发到其他处理器上执行,或者被分发到其他线程上执行。

block访问外部变量:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值