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方法了

相关文章推荐

iOS内存管理(4)--Block属性用copy修饰 & 避免循环引用的问题

一、Block的类型 根据Block在内存中的位置分为三种类型NSGlobalBlock,NSStackBlock, NSMallocBlock。 NSGlobalBlock:类似函数,位于te...
  • Winzlee
  • Winzlee
  • 2016年06月23日 20:35
  • 5834

IOS开发--循环引用问题,普通控件为什么用weak,代理为什么用weak,block内用到外面的东西要用__weak

循环引用问题,普通控件为什么用weak,代理为什么用weak,block内用到外面的东西也要用weak,当控制器想要销毁时,控制器被一个强指针指着,而scrollView添加到控制器view中也被强指...

iOS Block的循环引用问题

block与内存 block的循环引用

iOS: ARC和非ARC下使用Block与循环引用问题

1. Block的声明和线程安全 Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的,可以参考之前的文章(iOS: 非A...

iOS 中关于block 的循环引用问题

NSURL *url = [NSURL URLWithString:@"http://localhost:8080"]; // 2.创建一个请求对象 ASIFormDataR...

精通iOS开发--第15章 Grand Central Dispatch和后台处理之Block与Self的循环引用

Block与Self的循环引用 01:众所周知若self中引用了Block块,而此Block块中又引用了Self则会造成循环引用,需要提醒的是即使在你的block代码中没有显式地出现"self"...

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

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

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

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

iOS Block循环引用精讲

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

半路出家, 我的iOS自学之路-4-Block的声明,定义,闭包性,强引用循环

半路出家, 我的iOS自学之路-4-Block的声明,定义,闭包性,强引用循环 我是一只绝望的菜鸟, 只学过Java, 半路出家, 自学iOS. 以下是我读完《Objective - C 编程》(第...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ios block循环引用问题
举报原因:
原因补充:

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