博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS-浅谈block
阅读量:4045 次
发布时间:2019-05-24

本文共 978 字,大约阅读时间需要 3 分钟。

*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内修改变量的值。

转载地址:http://ofwci.baihongyu.com/

你可能感兴趣的文章
MongoDB中的_id和ObjectId
查看>>
美团酒店Node全栈开发实践
查看>>
MongoDB分片实战(一):集群搭建
查看>>
MongoDB分片实战(二):Sharding
查看>>
TLS/HTTPS 证书生成与验证
查看>>
用Node.js创建自签名的HTTPS服务器
查看>>
单点登录的三种实现方式
查看>>
Mongodb启动命令mongod参数说明
查看>>
理解Node.js中间件以及Connect 模块
查看>>
Nodejs基础中间件Connect
查看>>
Http头介绍:Expires,Cache-Control,Last-Modified,ETag
查看>>
Nginx+Tomcat实现负载均衡、Redis实现Tomcat session会话共享
查看>>
MySQL集群
查看>>
mongodb mongoexprt 导出数据 json csv格式
查看>>
MySQL MERGE存储引擎 简
查看>>
数据库分片(Sharding)与分区(Partition)的区别
查看>>
node.js递归打印文件目录、文件名
查看>>
本地与远程linux上传下载
查看>>
NodeJS的代码调试和性能调优
查看>>
浅谈V8引擎中的垃圾回收机制
查看>>