一.一个对象没有被引用,那么在函数块完成时就会被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的更多相关文章

  1. 解决NSTimer循环引用Retain Cycle问题

    解决NSTimer循环引用Retain Cycle问题 iOS开发中以下的情况会产生循环引用 block delegate NSTimer 循环引用导致一些对象无法销毁,一定的情况下会对我们横须造成影 ...

  2. Block 循环引用(中)

    不会造成循环引用的block 大部分GCD方法 dispatch_async(dispatch_get_main_queue(), ^{ [self doSomething]; }); 因为self并 ...

  3. Block循环引用详解

    前言 在项目中经常用到block,使用不当就很容易因为循环引用而造成内存泄漏.本文分析了block循环引用形成原因以及处理办法,如果有什么不对或者疑问请留言. 什么情况下block会造成循环引用 bl ...

  4. iOS循环引用问题

    今天面试问道了循环引用,所以就看了看,原来只是知道使用了Block容易造成循环引用.今天就来简单的介绍一些循环引用. 先来简单介绍一下什么是循环引用? 循环引用可以简单的理解成:A对象引用了B对象,B ...

  5. EntityFramework Model有外键时,Json提示循环引用 解决方法

    正文之前先说两句,距离上篇博客已将近两个月,这方面的学习和探索并没有停止,而是前进道路上遇上了各种各样的问题,需要不断的整理.反思和优化,这段时间的成果,将在最近陆续整理发出来. 个人感觉国内心态太浮 ...

  6. block为什么用copy以及如何解决循环引用

    在完成项目期间,不可避免的会使用到block,因为block有着比delegate和notification可读性更高,而且看起来代码也会很简洁.于是在目前的项目中大量的使用block. 之前给大家介 ...

  7. ios 避免循环引用

    类似网络请求的情况下会导致循环引用,但是 如果网络请求的对象是局部变量,就必须用self,不能用weakSelf,否则,一旦当前方法所在对象销毁,那weakSelf就为空了(如果目的是这样,那就另当别 ...

  8. webapi修改tt模板给字段添加JsonIgnore特性解决转换json循环引用问题

    0.问题描述 EF生成的model带有导航属性,则json序列化会报循环引用错误,尝试如下 protected void Application_Start() { GlobalConfigurati ...

  9. 序列化类型 System.Data.Entity.DynamicProxies 的对象时检测到循环引用

    学习 EF Code First+MVC 时遇到了在请求JsonResult时出现 序列化类型 System.Data.Entity.DynamicProxies 的对象时检测到循环引用 的异常,原因 ...

随机推荐

  1. 【Python数据分析】Python3操作Excel(二) 一些问题的解决与优化

    继上一篇[Python数据分析]Python3操作Excel-以豆瓣图书Top250为例 对豆瓣图书Top250进行爬取以后,鉴于还有一些问题没有解决,所以进行了进一步的交流讨论,这期间得到了一只尼玛 ...

  2. QuickHit项目(输出字符串游戏)

    public class leve { private int leveNo; private int strLength; private int strTimes; private int tim ...

  3. java多线程系类:JUC线程池:01之线程池架构

    概要 前面分别介绍了"Java多线程基础"."JUC原子类"和"JUC锁".本章介绍JUC的最后一部分的内容--线程池.内容包括:线程池架构 ...

  4. C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 密码强化、网络安全强化

    公司的系统庞大后,用户数量也庞大,容易引起各种网络安全相关问题,需要把每个用户的网络安全意识都提高,由于历史原因有些用户的密码过于简单,很容易被猜到,引起很多没必要的麻烦. 系统登录成功后,检查密码复 ...

  5. Eclipse添加JPDL4 Schema校验

    由于jbpm官方提供的图形化流程设计器(GPD)功能并不是特别的全面,很多设计并不能全在图形界面下完成.因此,在很多情况下,我们需要直接编辑JPDL的XML源代码,所以, 最好为JPDL XML指定S ...

  6. FineUI(专业版)实现百变通知框(无JavaScript代码)!

    博客园已经越来越不公正了,居然说我这篇文章没有实质的内容!! 我其实真的想问哪些通篇几十个字,没任何代码和技术分享,嚷嚷着送书的文章的就能雄霸博客园首页几天,我这篇文章偏偏就为管理员所容不下. 其实我 ...

  7. 【原创】O2O,你真的知道怎么玩吗?

    自从2011年8月份,O2O的概念被Alex Rampell提出,并且在当年的11月份被引入中国以来,O2O这一概念就好像给久无新意的中国互联网行业,打了一针兴奋剂.O2O这个词也如麦当劳,星巴克这些 ...

  8. JavaScript类库---JQuery(二)

    接上: 6.Ajax:  一个基础底层函数:jQuery.ajax();  //高级工具函数都会调用此函数:  一个高级工具方法:load() ;  四个高级工具函数:jQuery.getScript ...

  9. python基础-装饰器

    一.什么是装饰器 装饰器本质就是函数,功能是为其他函数附加功能 二.装饰器遵循的原则 1.不修改被修饰函数的源代码 2.不修改被修饰函数的调用方式 三.实现装饰器的知识储备 装饰器=高阶函数+函数嵌套 ...

  10. 篇一:MySQL中case when then

    图一: 图二: