时间:2016-06-07 13:07:49

标签: objective-c memory-leaks instance-variables

我有一个大的目标-ci iPhone项目运行良好,除了在应用程序使用时内存使用不断增加,并且永远不会减少。当应用程序未被主动使用时,它不会增加。

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

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

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

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

1 个答案:

答案 0 :(得分:0)

我已经解决了将__weak或__unsafe_unretained放在引用父类的实例变量之前,如果该父类具有对子元素的引用。使用任何一种方法都表示父对象的引用计数不会增加。

如果您希望在访问变量但是该对象已被释放时抛出异常,请使用__unsafe_unretained。如果您不想要异常,请使用__weak,当对象被释放时,变量将变为nil。

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