Objective-C之block详细介绍

本文详细介绍了Objective-C中的Block,包括其定义、语法结构、捕获自由变量的机制,特别是__block修饰符的使用。同时,探讨了Block的内存管理,解析了栈块、堆块和全局块的区别,并且讲解了如何避免Block导致的保留环问题。
摘要由CSDN通过智能技术生成

 

1.定义

闭包是一个允许访问自由变量(局部变量)的匿名函数。自由变量:跟block声明在同一个作用域内的局部变量。

2.语法结构

返回类型 (^块名称)(参数列表)

int (^myblock)(int a, int b) ;         //声明一个块类型和块名,myblock为块名,块类型为int (^)(int a, int b);
myblock= ^(int a, int b) { return a+b;};   //定义块
int c = myblock(1,2);  //c = 3;     //调用块

从上面代码,块跟一个变量一样,先声明,定义,访问。
块变量与一般的C语言变量完全相同,可以作为以下用途。
局部变量
函数参数
静态变量
静态全局变量
全局变量

例1.块作为属性变量
@interface EOCClass : NSObject
@property ( nonatomic , strong ) int (^variableName)( int a, int b
);
@end

@implementation EOCClass
- (
id )init {
   if((self= [superinit])) {
       _variableName= ^(inta,intb) {    //定义一个块,但块里面的代码还没被调用
            return a + b;
        };
       
    }
   
return self ;
}

- (
void )fun {
   
int c = _variableName ( 1 , 2 );    //block 被调用,即执行上面定义的代码 a+b
}
@end

声明定义好一个块之后,就可以像传递一个变量一样,把block里面的代码传递到其他地方运行。这是块其中一个强大之处。

3.捕获自由变量

块另外一个强大之处是:在声明它的范围里,所有变量都可以为其捕获。例2
@implementation EOCClass
- (
id )init {
   
if (( self = [ super init ])) {
       
int additional = 5 ;
       
_variableName = ^( int a, int b) {    // 定义一个块
           
return a + b + additional;  //additional
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值