iOS-浅谈block

*block 跟 swift 中的闭包(closure)基本一样,都常用于值的回调,使用起来极为方便.
*block 格式:
1)block 开头 是”^”,接着是由小括号包起来的参数列表,行为主体由大括号包起来.
2)block 有四种类型,分别是无参无返回值 无参有返回值 有参无返回值 有参有返回值,一般使用的block 一般都是有参block(使用block 主要目的就是参数的传递)
*block 的循环引用问题
使用block 要注意类的循环引用,如一个控制器,self 强指针指向一个对象,而这个对象又强指针指向一个 block,而在block 中,又有强指针指向 self,从而造成循环引用,导致内存无法释放,造成内存泄漏

*解决block 循环引用方法:
用 __weak 来打断强引用,例如,用__weak 来定义一个 weakSelf 来指向 self 的地址,如果 self 被释放,weakSelf 执行 nil,从而打断循环引用.
注意: __weak 是 ARC 专有的, __unsafe_unretained 可以用在 ARC 也可以用在 MRC,但 __unsafe_unretained 是”assign”形式,如果指向的对象被释放,其指针指向的地址保持不变,如果继续使用该指针,就会出现”野指针”.

*block 内存管理
当block内部没有引用外部变量时,block存放在全局区;在运行时发现, block的本质是静态的static修饰的,所有全局可用, 这也是block可以跨类跨控制器调用的原因, 在MRC下,当block内部引用外部变量时,block存放在栈区;当对该栈区的block进行copy操作时,block将存放在堆区。在ARC下,当block内部引用外部变量时,block存放在堆区;关于堆区与栈区的区别,栈区主要存放局部变量,定义的参数等,在函数结束,系统会自动回收其内存空间,而堆区一般用程序员自行分配释放,若程序员不释放,程序结束时,由系统回收。总的来说,使用栈区更为快捷,而使用堆区更为灵活。

Block的使用注意点:
如果要在block中修改外部变量,当变量是static全局变量时,block可以直接修改,如果不是,可以用__block关键字来修饰,就可以在block内修改变量的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值