项目发http请求,现在一般的都是用的第三方开源库,当然发异步请求时我们也会写几个回调函数来进行请求返回时的处理。不过前段时间看一个朋友写的代码,里面很用block简单的实现了回调相关的部分。比如:
01 |
self.request=[ASIHTTPRequest requestWithURL:[NSURL URLWithString:url]]; |
02 |
[_request setRequestMethod:@ "GET" ]; |
04 |
[_request setCompletionBlock:^{ |
06 |
_mobileField.enabled= YES; |
07 |
_nextStepBtn.enabled = YES; |
08 |
NSInteger statusCode = [_request responseStatusCode]; |
09 |
NSString *result = [_request responseString]; |
看后感觉非常的方便与简单,但是使用Instruments跑的时候老是有内存泄漏的问题。后来查找一翻,I find out the reason;
原来block中调用了self或者self的成员变量,block就retain了self,而self也retain block,所以self和block都无法释放,最终形成cycle。
正确的写法如下:
01 |
self.request=[ASIHTTPRequest requestWithURL:[NSURL URLWithString:url]]; |
02 |
[_request setRequestMethod:@ "GET" ]; |
03 |
__unsafe_unretained ASIHTTPRequest *_requestCopy = _request; |
04 |
__unsafe_unretained RegistUserViewController *this = self; |
05 |
[_request setCompletionBlock:^{ |
07 |
this.mobileField.enabled= YES; |
08 |
this.nextStepBtn.enabled = YES; |
09 |
NSInteger statusCode = [_requestCopy responseStatusCode]; |
10 |
NSString *result = [_requestCopy responseString]; |
注意其中的__unsafe_unretained关键词,这个就是让block对所修饰的变量使用弱引用,也就ARC中的__weak。这样修饰的变量就不会被retain。
还有一种是用__block关键词的写法,也是官方文档中的写法(http://allseeing-i.com/ASIHTTPRequest/How-to-use);
01 |
- (IBAction)grabURLInBackground:(id)sender |
04 |
__block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; |
05 |
[request setCompletionBlock:^{ |
06 |
// Use when fetching text data |
07 |
NSString *responseString = [request responseString]; |
09 |
// Use when fetching binary data |
10 |
NSData *responseData = [request responseData]; |
12 |
[request setFailedBlock:^{ |
13 |
NSError *error = [request error]; |
15 |
[request startAsynchronous]; |
还有一种将self改成弱引用的写法是
__block typeof(self) bself = self;
关于block中的成员变量的调用方法也要注意下面两点:
对于property就用点操作符 bself.xxx
对于非property的成员变量就用->操作符 bself->xxx
最后总结,所有的这些都是围绕一点,block会retain相应的变量,我们要使用用弱引用修饰的变量。
最新文章
- Perform UPSERT / INSERT OR UPDATE against a SQLite Database
- DataContractSerializer序列化与反序列化遇到的奇怪问题
- LeetCode Longest Palindrome
- JDE开发端安装问题(JDE初步卸载重装)
- JAVA嵌套循环
- Ueditor防止代码自动清除
- (转)一网打尽当下NoSQL类型、适用场景及使用公司
- 网络编程3之TCP/IP协议
- PHP闭包和高阶函数
- iptables防火墙规则的添加、删除、修改、保存
- Java知识回顾 (6)正则表达式、方法、文件与异常
- 为notifyIcon.icon属性赋图片
- ZOJ 2975 Kinds of Fuwas
- Maven 入门篇 ( 上 )
- 从Java的堆栈到Equals和==的比較
- UndertowServer+SpringMVC+Thymeleaf模板引擎构建轻量级的web项目
- mybatis模糊查询语句
- nios 使用count binary 例程 只是led不闪
- Python中 字符串 转换为 字典
- PHP 重新格式化var_dump/print_r打印的数组
热门文章
- 『编写高质量代码Web前端开发修炼手册』读书笔记--高质量的CSS
- 如何选择Android自动化框架的几点拙见
- python - 接口自动化测试 - ReadConfig - 读取配置文件封装
- python 学习分享-函数篇
- java作业8
- HDU 4557 非诚勿扰(Treap找后继)
- javascript new关键字做了什么
- 基里巴斯(path)
- 17.2.10 NOIP模拟赛 聪哥的工资
- uml六种关系 【继实关聚组依】