2016-06-07 231 views
0

我有一个较大的objective-c iPhone项目,运行良好,除了在应用程序正在使用时内存使用量不断增加,并且从不减少。它不会在应用程序未被使用时增加。ARC上的Objective-c实例变量内存问题

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

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

有很多情况下两个对象将通过实例变量相互引用。我相信这是存储器问题的来源,因为我已经读过,ARC会计算剩余的剩余指针(来自另一个对象),因此绝不会从内存释放。

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

+0

仅供参考将它们移动到.h或.m无关紧要。如果你将它们移动到.h你正在公开它。 –

+0

好吧,我希望他们是私人的,那么是否有可能让他们变得“弱”? – AndyW

+0

相互引用的对象可能会导致问题。你有没有考虑过有父母和孩子的对象?您可以将需要的属性传递给子项,但子项只通过弱属性引用父项。 – Dominic

回答

0

我已经解决了将__weak或__unsafe_unretained放在引用父类的实例变量之前,如果该父类具有对子引用。使用或者意味着父对象的引用计数不会增加。

使用__unsafe_unretained如果您希望在访问变量但对象已释放时引发异常。如果你不想要异常,使用__weak,当对象被释放时,变量将变为零。

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