2010-02-10 21 views
0

我很難弄清楚如何管理一個實例變量的內存,該實例變量需要保持一段時間的當前狀態,然後重新分配給新分配的內存。什麼是正確的方式來管理iPhone應用程序中的內存經常被重新分配到新分配的內存的實例變量?

看看下面的例子爲實例變量「importantData」:

-(void)Update 
{ 
    importantData = [[self getObject] retain]; 
} 


- (SomeObject *)getObject 
{ 
    SomeObject *objInstance = [[SomeObject alloc] init]; 
    [objInstance autorelease]; 
    return objInstance; 
}  

在我的實際項目,那麼getObject方法是在不同的類,但我已經簡化它只是使對方瞭解我的觀點。在更新調用之間,importantData必須保持有效。

每次調用getObject時,我都會分配新的內存並將其分配給importantData,對嗎?我想我必須釋放重要數據之前指向的內存,對吧?我不知道如何在不泄漏內存或嘗試引用釋放內存的情況下正確執行此操作。謝謝!

回答

2

你只需要更新這個樣子:

-(void)Update 
{ 
    [importantData release]; 
    importantData = [[self getObject] retain]; 
} 

基本上,只記得你分配一個新值之前釋放。

1

你可以使用一個靜態變量。

static SomeObject *importantObject = nil; 

@implementation SomeObject 

+ (SomeObject*)getObject { 
    if (!importantObject) { 
    importantObject = [[SomeObject alloc] init]; 
    } 
    return importantObject; 
} 

@end 

這會一直存在,直到應用程序存在。但是,如果你想無效或重新創建它,你可以添加一個方法,如:

+ (void)expireObject { 
    [importantObject release]; 
    importantObject = nil; 
} 

甚至

+ (void)setObject:(SomeObject*)newObject { 
    [importantObject release]; 
    importantObject = [newObject retain]; 
} 

,現在您可以在SomeObject的類和實例方法使用importantObject,或把它拿來從其他類通過SomeObject的類方法獲取。