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

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

起初的代码如下:

- (void)getMyrelatedShops

{

[self.loadTimerinvalidate];

self.loadTimer = [NSTimerscheduledTimerWithTimeInterval:0.1

target:discoverView

selector:@selector(loadWaiting)

userInfo:nil

repeats:YES];

sendedRequest = [[FindShopServicesharedInstance] getMyRelatedShopsWithPageNO: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.loadTimerinvalidate];

self.loadTimer = [NSTimerscheduledTimerWithTimeInterval:0.1

target:discoverView

selector:@selector(loadWaiting)

userInfo:nil

repeats:YES];

__unsafe_unretainedFindShopVC *wfindShopVC = self;

sendedRequest = [[FindShopServicesharedInstance] getMyRelatedShopsWithPageNO:pageNo

successBlock:^(TMRequest *request){

[wfindShopVC.loadTimer invalidate];

[wfindShopVC shopListRequestFinished:request];

}failedBlock:^(TMRequest *failedRequest){

[wfindShopVC.loadTimer invalidate];

[wfindShopVC shopListRequestFailed:failedRequest];

}];

}

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

关于block的详细解释可参考 http://www.cnblogs.com/kesalin/archive/2013/04/30/ios_block.html

ios block循环引用问题的更多相关文章

  1. ios - block循环引用Demo示例

    当实例变量中有了block属性,并且用copy来修饰,但是当调用block中的代码的时候,如果block中运用了self.属性的时候回造成循环引用. // // ViewController.h // ...

  2. iOS Block循环引用

    在介绍block循环引用前我们先了解一下typeof. typeof是什么??? typeof 是一个一元运算,放在一个运算数之前,运算数可以是任意类型. 它返回值是一个字符串,该字符串说明运算数的类 ...

  3. IOS block 循环引用的解决

    在介绍block循环引用前我们先了解一下typeof. typeof是什么??? typeof 是一个一元运算,放在一个运算数之前,运算数可以是任意类型. 它返回值是一个字符串,该字符串说明运算数的类 ...

  4. iOS中Block循环引用的问题

    说到循环引用问题,想必大家都碰到过吧,比如在使用Block的时候,使用__weakSelf来代替self解决等,但是对于这个,还是有不少可以探索的点,下面我就来说下,希望对大家有所帮助. 是否所有的B ...

  5. Block循环引用问题(Objective-c)

    造成循环引用的简单理解是:Block的拥有者在Block作用域内部又引用了自己,因此导致了Block的拥有者永远无法释放内存,就出现了循环引用的内存泄漏 示例代码 @interface ObjTest ...

  6. Block循环引用详解

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

  7. Block 循环引用(上)

    iOS的内存管理机制 Objective-C在iOS中不支持GC(垃圾回收)机制,而是采用的引用计数的方式管理内存. 引用计数:在引用计数中,每一个对象负责维护对象所有引用的计数值.当一个新的引用指向 ...

  8. ios 避免循环引用

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

  9. Block循环引用问题研究

    自从苹果在objc中添加Block功能支持以后已经过了很久.目前网上对于Block的使用有很多介绍.不过对于Block的内存管理问题,则是众说纷纭.再加上objc开始使用ARC以后,对于Block的内 ...

随机推荐

  1. python中eval, exec, execfile,和compile [转载]

    eval(str [,globals [,locals ]])函数将字符串str当成有效Python表达式来求值,并返回计算结果. 同样地, exec语句将字符串str当成有效Python代码来执行. ...

  2. first-,second- and third-class value

    In computer science, a programming language is said to have first-class functions if it treats funct ...

  3. python binary lib on win/各种python库的二进制包

    虽然很不愿意在windows上折腾python,但有时linux不在身边的时候还得在windows上写代码.很久之前找到这个地址,后来忘了,今天搜了半天才把它找到,所以记录一下. http://www ...

  4. javascript笔记整理(DOM对象)

    DOM--document(html xml) object modle,document对象(DOM核心对象),document对象是 Window 对象的一部分,可通过window.documen ...

  5. javascript笔记整理(对象基础)

    一.名词解释 1.基于对象(一切皆对象,以对象的概念来编程) 2.面向对象编程(Object Oriented Programming,OOP) A.对象(JavaScript 中的所有事物都是对象) ...

  6. perl 回调函数

    在计算机程序设计中,回调函数,或简称回调(Callback),是指通过函数参数传递到其它代码的,某一块可执行代码的引用.这一设计允许了底层代码调用在高层定义的子程序. 没啥不好理解的呀,就是向函数的参 ...

  7. HttpURLConnection中使用代理(Proxy)及其验证(Authentication)

    HttpURLConnection中使用代理(Proxy)及其验证(Authentication) 使用Java的HttpURLConnection类可以实现HttpClient的功能,而不需要依赖任 ...

  8. 基于visual Studio2013解决C语言竞赛题之1022最大数最小数

         题目 解决代码及点评 /************************************************************************/ ...

  9. DOM API

    documentObject.documentElement 返回文档的根节点 document.documentElement; //返回<HTML><HTML>

  10. 关于innodb purge thread和master thread

    由innodb_purge_threads控制purge线程数. (>= 5.6.5)的版本号中该值默觉得1.最大值为32.默认值1表示innodb的purge操作被分离到purge线程中,ma ...