2016-06-07 227 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; 
}