在ARC机制下,app的内存管理由操作系统进行管理,不须要程序猿手动的管理内存,方便了开发.虽然,自己主动释放内存非常方便。可是并不是绝对安全,绝对不会产生内存泄露。

大部分导致iOS对象无法按预期释放的一个无形杀手是——循环引用。

循环引用能够简单理解为A引用了B,而B又引用了A,两方都同一时候保持对方的一个强引用。导致不论什么时候引用计数都不为0,始终无法释放。

以下我们介绍下block代码块,引起的循环引用以及解决的方法

block在copy时都会对block内部用到的对象进行强引用。第一种easy引起循环引用的一般表现为。某个类将block作为自己的属性变量,然后该类在block的方法体里面又使用了该类本身。简单说就是self.MyBlock = ^(Type var){[self dosomething]; 或者self.otherVar = XXX;或者_otherVar = …}, 造成了self 拥有一个block的时候,在block 又调用self的方法。block的这样的循环引用会被编译器捕捉到并及时提醒。

举比例如以下(People类):



我们能够看出在block的实现内部又使用了People类(self)的name属性。这个时候,编译器提醒给出了相关的警告.

解决方法:



通过使用_weak声明一个取代self的新变量取代原先的self,命名为weakSelf。通过这样的方式告诉block,不要在block内部对self进行强制强引用.

这样的循环引用的事例图为:

另外一种情况为:比如self 有一个button ,而你有要 调用 button的某个东西设置.[self.button ^{ }]因为某些原因,你又要在这个block里调用self的其它控件,比如self.textField.text = @”text”;就造成了讯混引用。

(即:控制器中有一个控件,在这个控件中又訪问了控制器的其它控件).比如AlertController中的Action对象訪问AlertController的textField对象.

为了进行演示的事例:首先我们定义了一个UIAlertController的子类(AlertController),并实现它的dealloc方法

- (void)dealloc{
NSLog(@"alertController dealloc");
}



在主控制器中创建AlertController,并实现点击确认的方法(获取其上的文本框内容信息)



点击确认后,打印例如以下



我们发如今销毁AlertController的时候,AlertController并没有释放,导致了内存的泄露.

改动为例如以下方式,点击确认后结果为:



能够看出,对象得到释放.

没有改动之前的事例图为:



解决循环引用后

解决方法

简而言之就一句话的事情:

__weak typeof (self) weakSelf = self;

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循环引用问题研究

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

  8. ios block循环引用问题

    ios开发中,开了ARC模式,系统自动管理内存,如果程序中用到了block就要注意循环引用带来的内存泄露问题了 这几天遇到一个问题,正常页面dismiss的时候是要调用dealloc方法的,但是我的程 ...

  9. block循环引用

    block里边会有循环引用的风险,它可能对外部一个变量出现强引用,所以需要判断里边是否有循环引用,通过dealloc方法(销毁当前控制器.或销毁要测试的变量),判断是否循环引用.主要在block 里边 ...

  10. Block 循环引用(中)

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

随机推荐

  1. 【Luogu】P3391文艺平衡树(Splay)

    题目链接 ddosvoid和自为风月马前卒教了我这道题 他们好强啊 如果我们要反转区间[l,r] 我们首先把l的前驱旋转到根节点 再把r的后继旋转到根节点的右儿子 那么此时根节点的右儿子的左儿子所代表 ...

  2. UOJ 274 【清华集训2016】温暖会指引我们前行 ——Link-Cut Tree

    魔法森林高清重置, 只需要维护关于t的最大生成树,然后链上边权求和即可. 直接上LCT 调了将近2h 吃枣药丸 #include <cstdio> #include <cstring ...

  3. SPOJ QTREE4 Query on a tree IV ——动态点分治

    [题目分析] 同bzoj1095 然后WA掉了. 发现有负权边,只好把rmq的方式改掉. 然后T了. 需要进行底(ka)层(chang)优(shu)化. 然后还是T 下午又交就A了. [代码] #in ...

  4. RRAS

    远程访问控制是Windows NT.Win200x Server提供的一种远程服务,它允许用户从远端通过拨号连接连接到一个本地的计算机网络,一旦建立了连接,就相当于处在了本地的LAN中,从而可以使用各 ...

  5. R语言入门视频笔记--3-1--矩阵与数组

    生成一个新矩阵,多用一些参数吧这次: x <- c(12,13,14,15) rname <- c("R1","R2") nname <- c ...

  6. Android开发之(1)AnimationListener

    1,就像Button控件有监听器一样,动画效果也有监听器,只需要实现AnimationListener就可以实现对动画效果的监听,只需要实现AnimationListener就可以实现对动画效果的监听 ...

  7. R必学包之dplyr

    http://www.360doc.com/content/17/1204/10/50223086_709726679.shtml

  8. T1405 奶牛的旅行 codevs

    http://codevs.cn/problem/1405/ 时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 农民John的农场 ...

  9. Win10激活Office2013的技巧

    原文:http://www.xitongzhijia.net/xtjc/20150720/53252.html KMSpico Win10激活工具 是一款能激活Win8/Win8.1/win10/Of ...

  10. DeepFM

    DeepFM integrates the architectures of FM and deep neural networks (DNN). It models low-order featur ...