ios block循环引用问题

转载 2015年07月06日 17:02:18

ios开发中,开了ARC模式,系统自动管理内存,如果程序中用到了block就要注意循环引用带来的内存泄露问题了

这几天遇到一个问题,正常页面dismiss的时候是要调用dealloc方法的,但是我的程序就是不调用,研究了好久终于找到了问题出在哪里了

起初的代码如下:

- (void)getMyrelatedShops

{

    [self.loadTimer invalidate];

    self.loadTimer = [NSTimer scheduledTimerWithTimeInterval:0.1

                                                 target:discoverView

                                               selector:@selector(loadWaiting)

                                               userInfo:nil

                                                repeats:YES];

     

    sendedRequest = [[FindShopService sharedInstancegetMyRelatedShopsWithPageNO:pageNo

                                                                     successBlock:^(TMRequest *request){

                                                                         [self.loadTimer invalidate];

                                                                         [self shopListRequestFinished:request];

                                                                     }failedBlock:^(TMRequest *failedRequest){

                                                                         [self.loadTimer invalidate];

                                                                         [self shopListRequestFailed:failedRequest];

                                                                     }];

}

代码表面上看起来没有什么问题,但是细细研究就会发现两个问题

1、block中引用到self,self 被block retain,sendedRequest又retain了该block的一根拷贝

2.sendedRequest是在self类中定义赋值,因此是被self retain

因此就形成了循环引用,不会调用dealloc

还有一个问题,只要重复性 timer 还没有被 invalidated,target 对象就会被一直持有而不会被释放。因此当你使用 self 当作 target 时,你就不能期望在 dealloc 中 invalidate timer,因为在 timer 没有被invalidate 之前,dealloc 绝不会被调用。因此,需要找个合适的时机和地方来 invalidate timer,但绝不是在 dealloc 中。 

修改如下

- (void)getMyrelatedShops

{

    [self.loadTimer invalidate];

    self.loadTimer = [NSTimer scheduledTimerWithTimeInterval:0.1

                                                 target:discoverView

                                               selector:@selector(loadWaiting)

                                               userInfo:nil

                                                repeats:YES];

    

    __unsafe_unretained FindShopVC *wfindShopVC = self;

    

    sendedRequest = [[FindShopService sharedInstancegetMyRelatedShopsWithPageNO:pageNo

                                                                     successBlock:^(TMRequest *request){

                                                                         [wfindShopVC.loadTimer invalidate];

                                                                         [wfindShopVC shopListRequestFinished:request];

                                                                     }failedBlock:^(TMRequest *failedRequest){

                                                                         [wfindShopVC.loadTimer invalidate];

                                                                         [wfindShopVC shopListRequestFailed:failedRequest];

                                                                     }];

}

这样就避免了循环引用,页面注销时就会调用dealloc方法了

正确使用Block避免循环引用(一)

正确使用Block避免循环引用
  • wuyulunbi12580
  • wuyulunbi12580
  • 2016年10月09日 23:22
  • 663

Block的引用循环问题 (ARC & non-ARC)

2010年WWDC发布iOS4时Apple对Objective-C进行了一次重要的升级:支持Block。说到底这东西就是闭包,其他高级语音例如Java和C++已有支持,第一次使用Block感觉满简单好...
  • wildfireli
  • wildfireli
  • 2014年03月25日 14:56
  • 37121

iOS开发——Block引起循环引用的解决方案

内存问题始终是软件开发中的头等大事,iOS开发中也不例外,在面试中也是必问的问题。今天我们主要来讲讲Block中涉及的循环引用问题。当我们自己一开始写代码的时候,可能会大量在block中使用self,...
  • CHENYUFENG1991
  • CHENYUFENG1991
  • 2016年03月18日 01:04
  • 7649

iOS Block循环引用精讲

前言 本篇文章精讲iOS开发中使用Block时一定要注意内存管理问题,很容易造成循环引用。本篇文章的目标是帮助大家快速掌握使用block的技巧。 我相信大家都觉得使用block给开发带来了...
  • RunCsdn
  • RunCsdn
  • 2016年03月10日 14:25
  • 311

iOS Block 需不需要在Block内使用 __weak 来防止循环引用

在OC开发中使用 Block时防止循环引用,大家都知道要加 __weak 来防止循环引用,如下面的宏就是为了解决循环引用而添加的 /**  * 快速生成weak/strong类型的对象  */ #de...
  • jeffasd
  • jeffasd
  • 2016年06月18日 16:51
  • 2830

iOS 中Block的正确使用避免循环引用和Crash

Block的使用相对于一个函数,下面我们主要讲解下block在使用中遇到的循环引用,如何解决的问题进行讲解: 继MRC后苹果推出了ARC,方便了广大开发者解决内存管理问题,下面我们主要针对MRC...
  • u010044221
  • u010044221
  • 2016年03月28日 13:39
  • 729

iOS Block的循环引用问题

block与内存 block的循环引用
  • fuzongjian
  • fuzongjian
  • 2016年02月27日 16:59
  • 799

iOS容易造成循环引用的三种场景之Block以及对应的使用方法(二)

block在copy时都会对block内部用到的对象进行强引用(ARC)或者retainCount增1(非ARC)。在ARC与非ARC环境下对block使用不当都会引起循环引用问题。 一般表现为: 1...
  • qq_26544491
  • qq_26544491
  • 2015年06月03日 10:42
  • 2265

简单快速的理解block的循环引用及__weak的使用条件

block循环引用会导致开辟的内存空间因为相互的引用而无法释放,是占用多余的内存空间的行为。在开发中,我们或多或少的都会遇到block块,但是新手因为接触的少,无法有条理的进行分析来确认是否存在循环引...
  • wuzesong
  • wuzesong
  • 2016年12月13日 11:07
  • 680

私有成员变量在block如何避免循环引用

最近,接手外包公司的项目,项目中用到大量的block,我们都知道block相对于代理是比较方便的,但是需要注意的就是如何避免循环应用导致的内存泄漏的问题,毫无疑问,外包的项目代码质量果然不太理想,经过...
  • lybeen2007
  • lybeen2007
  • 2016年09月09日 17:06
  • 1173
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ios block循环引用问题
举报原因:
原因补充:

(最多只允许输入30个字)