第3月第9天 循环引用 block
一.一个对象没有被引用,那么在函数块完成时就会被dealloc,这种情况因为对象销毁了,block块也永远不会执行。
MyNetworkOperation *op = [[MyNetworkOperation alloc] init]; [op addCompletionHandler:^(MyNetworkOperation *completedOperation) {
completion([NSArray array]); } errorHandler:^(MyNetworkOperation *completedOperation, NSError *error) {
errorBlock(completedOperation, error);
}];
二. NSOperationQueue引用
1.NSOperationQueue可以addOperation,这样operation对象就会被引用了,并在operation完成时operation对象会dealloc。
MKNetworkOperation *op = [self operationWithPath:OralThingCommentsByThing36idPage(thing36id,page)
params:nil
httpMethod:GETMETHOD];
[self addSwycHeaders:op];
[op addCompletionHandler:^(MKNetworkOperation *completedOperation) { NSString *valueString = [completedOperation responseString];
DLog(@"�� serverResponse:%@��", valueString); completion([NSArray array]); } errorHandler:^(MKNetworkOperation *completedOperation, NSError *error) {
errorBlock(error);
}]; [self enqueueOperation:op];
return op;
2.但如果uiviewcontroller又引用了operation,block块中又调用了self,那么就有循环引用了,解决方法是weakSelf.
MKNetworkOperation *thingsOp = [[SwycEngine sharedEngine] OralThingCommentsByThing36id:thing36id page:page rows:rows CompletionHandler:^(id object) {
NSArray *arr = object; self.totalThingComments = [Application sharedInstance].totalThingComments; if (refresh) {
self.page = ;
vc.thingComments = [NSMutableArray arrayWithArray:arr];
} else {
if (arr.count > ) {
self.page++;
[vc.thingComments addObjectsFromArray:arr]; }
}
[vc.tableView reloadData];
// 结束刷新
[self.tableView.mj_footer endRefreshing];
[self.tableView.mj_header endRefreshing];
} errorHandler:^(NSError *error) {
// 结束刷新
[self.tableView.mj_footer endRefreshing];
[self.tableView.mj_header endRefreshing]; }];
self.thingsOp = thingsOp;
三、数组应用
一个其他对象的数组可以addObject,这样对象就会被引用了,但block完成时数组还在,所以对象没有dealloc。解决方法是数组移除对象。
1.其他操作移除
MyNetworkOperation *op = [[MyNetworkOperation alloc] init]; [op addCompletionHandler:^(MyNetworkOperation *completedOperation) {
completion([NSArray array]); } errorHandler:^(MyNetworkOperation *completedOperation, NSError *error) {
errorBlock(completedOperation, error);
}]; [self.operationArr addObject:op]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)( * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
self.operationArr = nil;
}); return op;
2.以下代码好像会循环引用,self.operationArr包含op,op的block里又调用self,实际是对象会被dealloc.
__weak typeof(op) weakOp = op; [op addCompletionHandler:^(MyNetworkOperation *completedOperation) {
completion([NSArray array]); self.operationArr = [NSMutableArray array];
if (weakOp) { } } errorHandler:^(MyNetworkOperation *completedOperation, NSError *error) {
errorBlock(completedOperation, error);
}]; [self.operationArr addObject:op];
- (void) queryMentor:(NSDictionary *)dic
page:(NSInteger)page
rows:(NSInteger)rows
sort:(NSString *)sort
refresh:(BOOL)refresh
{
__unsafe_unretained typeof(self) vc = self; MKNetworkOperation *currentOperation = [[SwycEngine sharedEngine] oralCategoryByLangPage:LangTypeEnglish page:page rows:rows CompletionHandler:^(id object) {
NSArray *arr = object; if (refresh) {
self.page = ;
vc.items = [NSMutableArray arrayWithArray:arr];
} else {
if (arr.count > ) {
self.page++;
[vc.items addObjectsFromArray:arr]; }
}
[vc.tableView reloadData];
// 结束刷新
[self.tableView.mj_footer endRefreshing];
[self.tableView.mj_header endRefreshing]; vc.currentOperation = nil;
} errorHandler:^(NSError *error) {
// 结束刷新
[self.tableView.mj_footer endRefreshing];
[self.tableView.mj_header endRefreshing]; vc.currentOperation = nil;
}]; self.currentOperation = currentOperation; }
唐巧 ios面试题 什么时候在block中不需要使用weakSelf
https://www.zhihu.com/question/34593410
第3月第9天 循环引用 block的更多相关文章
- 解决NSTimer循环引用Retain Cycle问题
解决NSTimer循环引用Retain Cycle问题 iOS开发中以下的情况会产生循环引用 block delegate NSTimer 循环引用导致一些对象无法销毁,一定的情况下会对我们横须造成影 ...
- Block 循环引用(中)
不会造成循环引用的block 大部分GCD方法 dispatch_async(dispatch_get_main_queue(), ^{ [self doSomething]; }); 因为self并 ...
- Block循环引用详解
前言 在项目中经常用到block,使用不当就很容易因为循环引用而造成内存泄漏.本文分析了block循环引用形成原因以及处理办法,如果有什么不对或者疑问请留言. 什么情况下block会造成循环引用 bl ...
- iOS循环引用问题
今天面试问道了循环引用,所以就看了看,原来只是知道使用了Block容易造成循环引用.今天就来简单的介绍一些循环引用. 先来简单介绍一下什么是循环引用? 循环引用可以简单的理解成:A对象引用了B对象,B ...
- EntityFramework Model有外键时,Json提示循环引用 解决方法
正文之前先说两句,距离上篇博客已将近两个月,这方面的学习和探索并没有停止,而是前进道路上遇上了各种各样的问题,需要不断的整理.反思和优化,这段时间的成果,将在最近陆续整理发出来. 个人感觉国内心态太浮 ...
- block为什么用copy以及如何解决循环引用
在完成项目期间,不可避免的会使用到block,因为block有着比delegate和notification可读性更高,而且看起来代码也会很简洁.于是在目前的项目中大量的使用block. 之前给大家介 ...
- ios 避免循环引用
类似网络请求的情况下会导致循环引用,但是 如果网络请求的对象是局部变量,就必须用self,不能用weakSelf,否则,一旦当前方法所在对象销毁,那weakSelf就为空了(如果目的是这样,那就另当别 ...
- webapi修改tt模板给字段添加JsonIgnore特性解决转换json循环引用问题
0.问题描述 EF生成的model带有导航属性,则json序列化会报循环引用错误,尝试如下 protected void Application_Start() { GlobalConfigurati ...
- 序列化类型 System.Data.Entity.DynamicProxies 的对象时检测到循环引用
学习 EF Code First+MVC 时遇到了在请求JsonResult时出现 序列化类型 System.Data.Entity.DynamicProxies 的对象时检测到循环引用 的异常,原因 ...
随机推荐
- 【2016-10-17】【坚持学习】【Day8】【工厂方法模式】
工厂方法模式又叫工厂模式,虚拟构造器模式 定义: 工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该 ...
- 洛谷10月月赛Round.1| P3398 仓鼠找sugar[LCA]
题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴是一个树形结构.这一天小仓鼠打算从从他的卧室(a)到餐厅(b),而他的基友同时要从他的卧室(c) ...
- Spring多种注入方式及注解实现DI
一.Bean作用域 spring容器创建的时候,会将所有配置的bean对象创建出来,默认bean都是单例的.代码通过getBean()方法从容器获取指定的bean实例,容器首先会调用Bean类的无参构 ...
- [No000080]右键解锁增强Chrome插件开发,破除防复制
昨天用360极速(虽然我不喜欢360.)浏览器,登陆知乎查阅一些东西,突然感觉有些观点很赞同,想copy转载一下,我了个去,它丫的居然不让我复制. 地址:https://www.zhihu.com/q ...
- 解决asp.net(C#)中 DataTime 空值 null为0001-01-01
SqlServer中的datetime类型的空值和c#中的DateTime的空值的研究 在SqlServer 2000中datetime 的空值即默认值为1900-01-01 00:00:00,C#中 ...
- 在WebAPI使用Session
最近在改写WebApp时要将以前用泛型处理例程写的Captcha 改成使用WebApi 来实作机制,在实作的过程中发现使用IRequiresSessionState session也无法使用(cont ...
- php 字符串和数字比较一些问题
本文章来给大家介绍关于php 字符串和数字比较一些问题,因为数字与字符在php中是不同的数据类型,所以在比较时可能会有很多的问题. ,1,2等等,其中0标示成功,其他表示不同的错误代码.程序通过 if ...
- C#中的try catch 和finally
错误的出现并不总是编写应用程序的人的原因,有时应用程序会因为终端用户的操作而发生错误.无论如何,我们都应预测应用程序和代码中出现的错误. 这三个关键字try是必定要用的,要不然就失去了意义.然后cat ...
- struts2+spring+hibernate(SSH)框架的搭建和总结
SSH框架:struts2+spring+hibernate,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活.易于扩展的多层Web应用程序. struts2+spring+hibernat ...
- 【bzoj1923】 Sdoi2010—外星千足虫
http://www.lydsy.com/JudgeOnline/problem.php?id=1923 (题目链接) 题意 按顺序给出m个n元模线性方程,问最少当给出多少个方程时整个方程组有解. S ...