本文目录一览:
循环引用
循环引用解释:循环引用可以简单理解为A引用了B,而B又引用了A,双方都同时保持对方的一个引用,导致任何时候引用计数都不为0,始终无法释放。若当前对象是一个ViewController,则在dismiss或者pop之后其dealloc无法被调用,在频繁的push或者present之后内存暴增,然后APP就duang地挂了。下面列举我们变成中比较容易碰到的三种循环引用的情形。
一方面,NSTimer经常会被作为某个类的成员变量,而NSTimer初始化时要指定self为target,容易造成循环引用。 另一方面,若timer一直处于validate的状态,则其引用计数将始终大于0。
block在copy时都会对block内部用到的对象进行强引用(ARC)或者retainCount增1(非ARC)。在ARC与非ARC环境下对block使用不当都会引起循环引用问题,一般表现为,某个类将block作为自己的属性变量,然后该类在block的方法体里面又使用了该类本身,简单说就是self.someBlock = ^(Type var){[self dosomething];或者self.otherVar = XXX;或者_otherVar = ...};block的这种循环引用会被编译器捕捉到并及时提醒
在委托问题上出现循环引用问题已经是老生常谈了,本文也不再细讲,规避该问题的杀手锏也是简单到哭,一字诀:声明delegate时请用assign(MRC)或者weak(ARC),千万别手贱玩一下retain或者strong,毕竟这基本逃不掉循环引用了!
可以运行循环引用的情况
单利的情况下是允许循环应用 不需要释放
循环引用怎么解决
使用Excel操作单元格的时候,弹出了循环引用的提示,按照如下步骤即可取消Excel中的循环引用警告:
设备:华为笔记本。
系统:win7。
软件:excel。
版本:8.0.11。
1、首先打开一个excel表格,可以看到弹出了一个对话框提醒循环引用警告。
2、然后点击上方工具栏中的文件。
3、再点击文件选项卡下的选项。
4、在弹出的对话框中点击公式,在右侧勾选启用迭代计算。
5、最后点击确定即可取消excel中的循环引用警告了。
你真的了解循环引用吗?
循环引用的实质:多个对象相互之间有强引用,不能释放让系统回收。
如何解决循环引用?
1、避免产生循环引用,通常是将 strong 引用改为 weak 引用。
比如在修饰属性时用weak
在block内调用对象方法时,使用其弱引用,这里可以使用两个宏
#defineWS(weakSelf) __weak __typeof(*self)weakSelf = self;// 弱引用#defineST(strongSelf) __strong __typeof(*self)strongSelf = weakSelf;//使用这个要先声明weakSelf
还可以使用__block来修饰变量
在MRC下,__block不会增加其引用计数,避免了循环引用
在ARC下,__block修饰对象会被强引用,无法避免循环引用,需要手动解除。
2、在合适时机去手动断开循环引用。
通常我们使用第一种。
循环引用场景:
1. 自循环引用
对象强持有的属性同时持有该对象
2. 相互循环引用
3. 多循环引用
1、代理(delegate)循环引用属于相互循环引用
delegate 是iOS中开发中比较常遇到的循环引用,一般在声明delegate的时候都要使用弱引用 weak,或者assign,当然怎么选择使用assign还是weak,MRC的话只能用assign,在ARC的情况下最好使用weak,因为weak修饰的变量在释放后自动指向nil,防止野指针存在
2、NSTimer循环引用属于相互循环使用
在控制器内,创建NSTimer作为其属性,由于定时器创建后也会强引用该控制器对象,那么该对象和定时器就相互循环引用了。
如何解决呢?
这里我们可以使用手动断开循环引用:
如果是不重复定时器,在回调方法里将定时器invalidate并置为nil即可。
如果是重复定时器,在合适的位置将其invalidate并置为nil即可
3、block循环引用
一个简单的例子:
由于block会对block中的对象进行持有操作,就相当于持有了其中的对象,而如果此时block中的对象又持有了该block,则会造成循环引用。
解决方案就是使用__weak修饰self即可
并不是所有block都会造成循环引用。
只有被强引用了的block才会产生循环引用
而比如dispatch_async(dispatch_get_main_queue(), ^{}),[UIView animateWithDuration:1 animations:^{}]这些系统方法等
或者block并不是其属性而是临时变量,即栈block
还有一种场景,在block执行开始时self对象还未被释放,而执行过程中,self被释放了,由于是用weak修饰的,那么weakSelf也被释放了,此时在block里访问weakSelf时,就可能会发生错误(向nil对象发消息并不会崩溃,但也没任何效果)。
对于这种场景,应该在block中对 对象使用__strong修饰,使得在block期间对 对象持有,block执行结束后,解除其持有。
excel中循环引用怎么去掉
怎样取消excel里的循环引用
1、首先,需要找到“excel选项”,这个地方在Office2003版本里的“工具”选项里,而在Office2007版本里不好找,在所以这种强调一下,避免有些朋友找不到。
2、其次,点击“公式”选项,在“计算选项”中,可以看到“启用迭代计算”前面是没有勾选上的,将其勾选上之后,就能解决“循环引用”警告的问题了,表示excel默认可以进行循环引用。
3、最后,在“公式”选项卡上的“公式审核”中,点击“错误检查”,可以看到“循环引用”变成了灰色,处于不可操作状态。
4、针对公式使用错误导致的“循环引用”警告,这种情况就需要对公式本身进行更改。在“公式”选项卡中,错误检查的下拉三角可以看到,“循环引用”处于可编辑状态。
5、在“循环引用”的右拉选项中,可以看到相应使用错误公式的单元格,将其修改或者删除。这里每次只会显示一组循环引用的单元格,需要逐个进行操作之后,才能最终避免“循环引用”警告。