ios 添加block 类别_ios block 类型

网上有很多block文章,这篇只用来记录自己认为重要的点。

一、block本质是个对象,涉及闭包的概念,用于封装代码

int (^block)(int a,int b) = ^(int a,intb){return a +b;

};

定义: int (^block)(int a,int b)

参数: int   返回类型

int a 输出参数a(名称可以不写)

int b 输入参数b(名称可以不写)

实现:^(int a,intb){ return a +b; };

参数:int a,int b (名称不可缺)

{}实现

二、block由储存位置不同有的类型,这些类型只有编译器使用

1、 _NSConcreteStackBlock  (NSStackBlock)  存储在栈上;

2、 _NSConcreteGlobalBlock (NSGlobalBlock) 存储在程序的代码段;

3、 _NSConcreteMallocBlock (NSMallocBlock) 存储在堆上。

知识提示:C语言中储存有程序代码区(text)、全局区(静态)、常量区、栈区(stack)、堆区(heap,使用malloc)

说明:

NSGlobalBlock:在block内部没有引用任何外部变量

NSStackBlock:在block内部引用外部变量,处于栈上的block会随栈退出,引用导致奔溃。

NSMallocBlock:在其作用域外部使用的指针增加(copy、rerain)

注意:在arc情况下,没有NSStackBlock这个类型,如果有系统自动copy成为NSMallocBlock,同时拷贝代码内部变量如:

int base = 2;

base += 2; // base->4

long (^sums)(int,int)  = ^ long (int a,int b){

return base + a + b; //base->4

};

base ++; //base->5

NSLog(@"%ld",sums(1,2));

//输出的结果为 7 arc下提前拷贝base

经典事例,自带答案:http://blog.parse.com/learn/engineering/objective-c-blocks-quiz/

三、引用问题:只有NSMallocBlock支持retain、release操作 (老生常谈了具体自己搜吧)

1、block 内部代码修改数据情况:__block修饰、static

2、循环引用的问题:block代码段强引用,使用 __weak typeof (self) weakSelf = self;

3、block对象被提前释放:不要用__block

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值