OC中的循环引用

造成循环引用的原因:

  比如在main函数中创建了两个类的对象A和B,现在引用计数都是1.现在让A和B互相引用(A有一个属性是B对象),属性说明是retain,B有一个属性是A的对象,属性说明是retain),现在两个对象的引用计数都增加1,都变成2.

  现在执行[A release]; [B release]; 此时创建出来得main函数已经释放了自己对对象的持有权,但此时A和B的引用计数都还是1,因为他们互相引用了。

这时你发现A和B将无法释放,因为想要释放A必须先释放B,在B的的dealloc中再释放A,同理要释放B,必须先释放A,在A的dealloc中释放B,所有这两个对象一直存在内存中而不释放,这就是所谓的循环引用的问题

  要想解决这个问题,一般的方法可以将引用的属性设置为assign,而不是retain来处理。

时间: 2024-11-05 15:59:20

OC中的循环引用的相关文章

oc中设置手动引用和自动引用图解

1.把整个工程都设为手动引用 ----------------------------选中MRCAPP  再找到bulid settings------------------ ---------------------------------------在搜索框中输入arc---------------------------------------------------- 2.设置某个类手动引用 选中某个需要设置的类 然后双击     会跳出对话框  在里面输入:“-fno-abjc-ar

OC 中的强引用(strong referene)和弱引用( weak reference)

关于oc中的强弱引用,有需要的朋友可以参考下. 强引用和弱引用的广义区别 强引用也就是通常所讲的引用,其存亡直接决定了所指对象的存亡.如果不存在指向一个对象的引用,并且此对象不再显示列表中,则此对象会被从内存中释放.弱引用除了不决定对象的存亡外,其他与强引用相同.即使一个对象被持有无数个若引用,只要没有强引用指向他,那么其还是会被清除 简单来说,strong等同retain(ARC之前),而weak和assign,weak比assign多了一个功能,当对象消失后自动把指针变成nil. __wea

检测项目中的循环引用引起的内存问题

说到检测项目中的循环引用 可以有很多手段,其中牛叉的 instruments 当然是把利器. 当然开发过程中往往会大意引起的 循环引用 比如:忘写了 @weakify(self) && @strongify(self); 在大量使用RAC 和 block..... 当然引起这类原因还有很多... 如果分工明确的话可能会再项目结束后,专门测试这块...然而好像并不是每次迭代都会做这块的工作,除非被明确发现引起崩溃的情况. so  要是能把这个工作引入debug 期间,如果引起循环引用 可以抛

shell中while循环引用ssh命令的坑

原理shell代码如下: #!/bin/sh cat ../androidsrc | while read line do         ip=$(echo $line | awk '{print $1}')         srcdir=$(echo $line | awk '{print $2}')         destdir=$(echo $line | awk '{print $3}')         user=$(echo $line | awk '{print $4}')  

OC中的自动引用计数

目录: 1,自动引用计数的定义 2,强引用和弱引用 3,类比手动引用 4,循环引用 5,CoreFoundation 内容: 自动引用计数的定义: (Automatic Reference Counting) 在编译时自动在合适的位置加入retain 和 release,简化内存管理,自动引用计数不是内存管理,而是通过强引用(__strong)和弱引用(__weak)指针来标记内存的管理方式,当指向对象的强引用指针数等于0时,内存才会释放. 强引用和弱引用: __strong, 当我创建一个oc

如何在 iOS 中解决循环引用的问题

稍有常识的人都知道在 iOS 开发时,我们经常会遇到循环引用的问题,比如两个强指针相互引用,但是这种简单的情况作为稍有经验的开发者都会轻松地查找出来. 但是遇到下面这样的情况,如果只看其实现代码,也很难仅仅凭借肉眼上的观察以及简单的推理就能分析出其中存在的循环引用问题,更何况真实情况往往比这复杂的多: testObject1.object = testObject2; testObject1.secondObject = testObject3; testObject2.object = tes

彻底分析block中的循环引用

我做了一个被push到的controller,pop的时候,controller会释放,解析详见注释,欢迎批评指正! #import "AnimaViewController.h" @interface AnimaViewController () @property (nonatomic, strong) UIView *view1; @property (nonatomic, strong) UIView *view2; @property (nonatomic, copy) vo

简单聊一聊JS中的循环引用及问题

本文主要从 JS 中为什么会出现循环引用,垃圾回收策略中引用计数为什么有很大的问题,以及循环引用时的对象在使用 JSON.stringify 时为什么会报错,怎样解决这个问题简单谈谈自己的一些理解. 1. 什么是循环引用 当对象 1 中的某个属性指向对象 2,对象 2 中的某个属性指向对象 1 就会出现循环引用,(当然不止这一种情况,不过原理是一样的)下面通过代码和内存示意图来说明一下. function circularReference() { let obj1 = { }; let obj

javascript中的循环引用对象处理

先说明一下什么是循环引用对象: var a={"name":"zzz"}; var b={"name":"vvv"}; a.child=b; b.parent=a; 这里的a和b都是一个循环引用对象. 循环引用对象本来没有什么问题,序列化的时候才会发生问题,比如调用JSON.stringify()对该类对象进行序列化,就会报错: Converting circular structure to JSON.    而序列化需求很