iOS笔记 Block和内存管理
2015-08-12 22:57
267 查看
1.在块声明的范围里,所有变量都可以被它使用,不过不能修改。想要修改怎么办?可以在变量声明是加上__block。
2.如果块中使用的变量是对象类型,那么就会自动保留它。系统在释放这个块的时候,也会一并释放。
3.如果块定义在Ojective-C类的实例方法中,那么除了可以访问类的所有实例变量之外,还可以使用self变量。
块总能修改实例变量,并不需要在声明时加__block。
4.在块中使用实例变量如(_name),_name <=> self->_name,块也会保留self,可能到致循环应用
5.块默认是分配在栈上的,也就是说块只在定义它的范围里有效。
这个块就可能引发一些产生一些奇怪的问题。要避免这个问题,可以将block复制到堆上。
2.如果块中使用的变量是对象类型,那么就会自动保留它。系统在释放这个块的时候,也会一并释放。
3.如果块定义在Ojective-C类的实例方法中,那么除了可以访问类的所有实例变量之外,还可以使用self变量。
块总能修改实例变量,并不需要在声明时加__block。
4.在块中使用实例变量如(_name),_name <=> self->_name,块也会保留self,可能到致循环应用
5.块默认是分配在栈上的,也就是说块只在定义它的范围里有效。
void(^block)(); if(/**some condition*/) { block = ^{NSLog(@"Block A")}; } else { block = ^{NSLog(@"Block B")}; } block();定义在if及else语句中的两个块都分配在栈内存中。出了其作用域以后,栈中的内存可能被编译器覆盖掉。再去调用
这个块就可能引发一些产生一些奇怪的问题。要避免这个问题,可以将block复制到堆上。
void(^block)(); if(/**some condition*/) { block = [^{NSLog(@"Block A")} copy]; } else { block = [^{NSLog(@"Block B")} copy]; } block();
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- Ruby中Block和迭代器的使用讲解
- Ruby中使用Block、Proc、lambda实现闭包
- Ruby中的block、proc、lambda区别总结
- Lua的内存管理浅析
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- 深入探讨PHP中的内存管理问题
- .net平台推送ios消息的实现方法
- linux 内存管理机制详细解析
- 解析PHP中的内存管理,PHP动态分配和释放内存
- javascript内存管理详细解析
- JavaScript内存管理介绍
- 探讨Android与iOS,我们将何去何从?