ios开发中block使用小结
来源:互联网 发布:小众发单软件 编辑:程序博客网 时间:2024/06/14 08:36
一、block基本使用
声明:返回值(^block变量名)(参数)
定义 :三种形式
二、block保存一段代码
在某处在block内声明一段代码,在另一处调用
三、block传值
正向传值:被传值者声明属性来接收值
逆向传值:代理方法,委托方内声明协议
block逆向传值方法,传值者与接收值者只需三步
四、block循环引用
block造成循环引用:block会对其块中的所有强指针变量都强引用一次,需弱化(有的需强化)
a控制器 presentViewController:b控制器 后,b控制器不会销毁,此方法中 a控制器中的self.presentedViewController强引用了b控制器 ;b控制器[self dissmissViewController]
后,b控制器才会被释放 ==》 小岔知识点
block造成死循环:block代码块中,block会对里面的强指针变量都强引用一次,故若block块中若出现self,会造成死循环(block是self的属性,block属性的代码块中又强引用了self,故死循环)
block内部使用外部的一个对象,如果外部对象是强引用那么内部会自动生成一个强引用,引用着外部对象。如果外部对象时弱引用,那么内部会自动生成一个弱引用,引用着外部对象
五、block内存管理
外部局部变量 static修饰的局部变量 全局变量 __block修饰局部变量
retain copy:
非ARC下不copy的block会在栈中,ARC中的block都在堆上
block是一个对象,可以内存管理
判断一个工程是否是ARC
ARC管理原则:只要一个对象没有被强指针引用就会被销毁,默认局部变量对象都是强指针,存放于堆里边
MRC开发常识:1.MRC中没有strong,weak局部变量相当于基本数据类型,不会存放于堆里边,block即为基本数据类型
2.MRC给成员属性赋值,不可以使用下划线方式,一定要用set方法(即使用self.属性)的方式赋值
MRC:管理block
总结:1,只要block块内没有引用外部局部变量,block就放在全局区
1.1 块内没有引用任何变量:<__NSGlobalBlock__: 0x10c8d3070>
1.2 块内引用非block块外的static修饰的局部变量:<__NSGlobalBlock__: 0x10e2d1070>(因为static修饰的局部变量的声明周期变大了)
1.3 块内引用块内的局部变量:<__NSGlobalBlock__: 0x10fc5b070>
1.4 块内引用块外__block修饰的局部变量:<__NSStackBlock__: 0x7fff552c69a0>(虽然被__block修饰,依旧引用的是局部变量)
1.5 块内引用全局变量:<__NSGlobalBlock__: 0x10c4e1070>
2,只要block引用外部局部变量,block就被放在栈区 <__NSStackBlock__: 0x7fff56b149b8>
3,block只能用copy修饰,不能使用retain,使用retain,block还是在栈里,会造成坏内存
4, __block的作用:在block内修改快外局部变量的值,需要在声明此变量时用__block修饰此变量,才可修改
ARC:
ARC总结:
1,只要block块内没有引用外部局部变量,block就放在全局区too:
1.1 块内没有引用任何变量:<__NSGlobalBlock__: 0x10000c090>全局区
1.2 块内引用非block块外的static修饰的局部变量:<__NSGlobalBlock__: 0x106d89090>全局区
1.3 块内引用块内的局部变量:<__NSGlobalBlock__: 0x101b3f090>全局区
1.4 块内引用块外__block修饰的局部变量:<__NSMallocBlock__: 0x7fa818e0e990>堆区
1.5 块内引用全局变量:<__NSGlobalBlock__: 0x10fa74090>全局区
在MRC内的全局区在ARC还是全局区,在MRC的栈取都变成了堆区(ARC默认局部变量放在堆区)
2,只要block引用外部局部变量,block就被放在堆区 <__NSMallocBlock__: 0x7fae1be08410>堆区
七、block—变量传递
1. block块内调用的是纯粹的局部变量时,是值传递
2. block块内调用的是块外的静态局部变量、全局变量、__block修饰的块外部局部变量时,是指针传递
八、block的使用
1,block做方法的返回值:
masonry的点语法加括号 链式语法,是用含有参数且返回值是当前对象的block做方法的返回值实现的
get方法可以通过点语法调用,有参数的方法不能通过点语法调用
block在改方法调用时,调用了blodk
2,block做方法的参数:
参数block在此方法实现时调用即可;
block补充:
九、block的修饰:
1.ARC
1.1copy修饰block,此block就会存在堆空间。则会对block的内部对象进行强引用,导致循环引用,内存无法释放。
解决方法:用__weak修饰在block块内用到的强指针类型的对象。
1.2 weak修饰block,此block会放在栈空间,引用外部强指针类型的对象,不会造成循环引用。
2.MRC
用copy修饰后,若果block块内使用了强指针类型的对象,则需要对此强指针类型的对象进行__block修饰,才不会造成循环引用
- ios开发中block使用小结
- iOS开发之block使用小结
- IOS中Block小结
- iOS开发中--block和protocol(协议)小结
- iOS开发中Block的使用
- iOS开发中block基本使用
- iOS开发中block的使用
- iOS之block使用小结、在arc中使用block、如何防止循环引用
- ios 中使用 block
- iOS中-Block使用
- iOS中-Block使用
- iOS开发中 代理,block,KVO 的使用
- iOS 开发中使用block的注意点
- iOS开发--Block的使用
- iOS开发-block 简单使用
- iOS开发:block使用逻辑
- ios中怎样使用block
- iOS中使用block传值
- unity与android的相互调用
- 蓝桥杯 - 入门训练 - Fibonacci数列 - java
- LINUX下oracle中SQLPLUS时上下左右键乱码问题
- Oracle的AWR报告分析
- C语言strcpy函数所引发的问题
- ios开发中block使用小结
- ubuntu设置静态IP
- 知识库--synchronized集合+Concurrent集合 (91)
- GSoap工作原理简析
- cat命令
- Android视频播放让VideoView充满整个父控件的解决方案(附例子)
- [FaceDetect]基于Caffe的人脸检测实现
- 谷歌联合创始人:AI发展速度让我吃惊,但未来难料
- 前端Mvc模式简单讲解