我向所有init
和dealloc
添加了一些日志记录,以尝试理解为什么启用ARC的项目在运行时继续消耗越来越多的内存。我发现一个视图控制器负责。它在初始化时的主要职责是创建NSMutableArray
并用NSNull
个对象填充它。在执行期间,它会将这些空对象换成更有意义的对象,反之亦然 - 这是一种基本的延迟加载设置。
当弹出此视图控制器时,不会释放当时NSMutableArray
中的任何非空视图。因此,视图控制器本身也不会被释放。
我可以通过清空NSMutableArray
或将其设置为nil来解决此问题。
是什么让这有必要?如果我创建它,即使在ARC下,将数组设置为nil总是我的责任吗?或者必须保留其他东西保留数组中的一个对象,并阻止它自动解除分配?
答案 0 :(得分:1)
假设NSMutableArray
是一个实例变量,应该在释放视图控制器时释放它。如果在dealloc
只有NSMutableArray
个对象时调用了控制器的NSNull
,但是当你用“有意义的”内容填充数组时它没有被释放,这意味着你无疑拥有strong reference cycle,即必须在NSMutableArray
的内容中对视图控制器本身进行一些引用。