英语轻松读发新版了,欢迎下载、更新

iOS的类中使用一个指向AppDelegate的实例变量会造成这个类无法析构吗?

k19870203 发布于 2014年08月31日
无人欣赏。

我在AppDelegate中添加了一些属性来充当全局变量的角色,在部分类中使用了一个指向AppDelegate的实例变量,以方便的使用这些属性,我的同事更我说这么做会导致类似于循环保留的情况,导致这个类没有办法析构,我自己是觉得这么做在内存管理上是没啥问题,只是这货说的好像真的一样,强行装后面有人,导致我瞬间就虚了,请各位不灵赐教

共7条回复
adad184 回复于 2014年08月31日

可以 我一直这么做 而且 循环在哪里出现呢? 不是单向引用么

董一凡 回复于 2014年08月31日

最简单的证明办法,就是在你的类里重载dealloc,然后如果能调用到那就是正常释放了

针对你说的情况,确实有可能造成循环引用。因为你并没有把类之间的引用勤快描述的太清楚(比如谁持有谁,是strong还是weak),所以无从判断,你先想明白下,为什么delegate要声明成weak,而其他大部分property都是strong。你的情况到底属于哪种。

k19870203 回复于 2014年08月31日

2楼 @董一凡 实例变量是默认的strong 但是我不觉得全局的AppDelegate 会强引用实例变量所在的类 所以我觉得不会有什么问题

k19870203 回复于 2014年08月31日

2楼 @董一凡 顺带问下 dealloc被调用是不是就说明类将被成功析构 或者至少ARC管理的内存被成功释放

董一凡 回复于 2014年08月31日

3楼 @k19870203 strong 就一定是强引用。AppDelegate如果有一个strong的property指向类A,而类A里有一个strong的property指向AppDelegate,那就构成了循环引用。还是说你觉得AppDelegate里的strong和别的类里的strong不一样?

dealloc就是析构,说明内存被释放了。

k19870203 回复于 2014年08月31日

5楼 @董一凡 感谢回答 AppDelegate没有指向其他类的强引用只有其他类指向AppDelegate的强引用

董一凡 回复于 2014年09月01日

6楼 @k19870203 你还是没有描述清楚你的引用情况,你的AppDelegate里既然已经有全局变量了,那这些全局变量只要持有AppDelegate的strong property那就是循环引用,或许你没有直接持有,但是如果这些变量持有的strong property又持有AppDelegate,同样构成循环引用,甚至你在你的viewcontroller理持有AppDelegate,也可能构成循环引用

但是你这个情况比较特殊,因为AppDelegate是全局实例,所以本来就不存在释放的问题,即便循环引用了,也没有什么危害,毕竟程序退出的时候总是会清理所有内存的。不过从最佳实践的角度出发,总是不应该持有AppDelegate的strong property的,要么持有weak引用,用么使用系统提供的[[UIApplication sharedApplication] delegate]这种形式

登录 或者 注册