Objective-c ARC 开启时的实例变量内存问题

Objective-c instance variable memory issues with ARC on

我有一个运行良好的大型 objective-c iPhone 项目,只是在使用应用程序时内存使用不断增加,而且从不减少。当应用程序未被积极使用时,它不会增加。

我在 Java 中有一个几乎相同的 Android 应用程序,但没有这个问题。经过大量谷歌搜索和试验后,我认为问题是我所有的 class 变量都是实例变量,即它们在如下所示的 .m 文件中声明,并使用 getter 和 setter 进行访问。

@implementation SomeClass{
    NSString *someVariable;
    AnotherClass *anotherVariable;
}

在许多情况下,两个对象将通过实例变量相互引用。我相信这是内存问题的来源,因为我已经读到 ARC 将对这些对象中的每一个进行计数,这些对象中的每一个都有 1 个指向它们的剩余指针(来自另一个对象),因此永远不会从内存中释放任何一个。

理想情况下,我想要一个不需要将所有变量移动到 .h 文件的解决方案,也不需要更改每个变量的定义,即我想要一个可以应用于所有变量的解决方案,尽管我不知道这是否可能。我认为我说实例变量是 'strong' 是正确的,因为它们增加了该对象的 ARC 引用计数,我可以使我所有的实例变量 'weak',如果可以的话,这是一个好的还是坏主意?

我已经通过在引用父 class 的实例变量前放置 __weak 或 __unsafe_unretained 解决了这个问题,前提是该父有对子的引用。使用任何一个都意味着父对象的引用计数不会增加。

如果您希望在访问变量但对象已被释放时抛出异常,请使用__unsafe_unretained。如果不想异常就用__weak,对象释放时变量会变成nil。

@implementation SomeClass{
    NSString *someVariable;
    ChildClass *childVariable;
    __unsafe_unretained ParentClass *parentVar;
    __weak AnotherParentClass *AnotherParentVar;
}