2011-03-09 45 views
0

我有點困惑關於制定者漂浮在各種教程,文章,書籍等,下面是一個典型的變型的內存管理的例子:iOS的內存管理問題

- (void) setOldAmount: (NSNumber*)newAmount 
{ 
    if (oldAmount != newAmount) { 
    [oldAmount release]; 
    oldAmount = [newAmount retain]; 
    } 
} 


- (void) dealloc 
{ 
    [oldAmount release]; 
    [super dealloc]; 
} 

隨着oldAmount = [newAmount retain]; oldAmount的消息-retain ,由-dealloc中的-release消息平衡;但是如果newAmount正在發送-retain然後分配給oldAmount,newAmount在哪裏發佈?這不是內存泄漏嗎?

回答

2

newAmount和oldAmount都是指向對象的指針。您通過指針保留並釋放對象,但它是跟蹤它保留了多少次的對象。指向同一對象的兩個變量可以互換使用。例如:

NSNumber *a = [[NSNumber alloc] initWithInt:5]; 
NSNumber *b = a; 
[b release]; 

由於a和b都指向相同的對象,因此第三行的版本會平衡第一行的alloc。

在你的例子中是一樣的。 newAmount被保留,但oldAmount被分配指向同一個對象。下一次調用setOldAmount:(或-dealloc)時,該對象將被釋放。需要注意的是:

oldAmount = [newAmount retain]; 

只是有點速記的,這意味着同樣的事情:

oldAmount = newAmount; 
[oldAmount retain]; 

除了保留並以不同的順序分配發生(不使任何區別結果)。

很好理解此代碼中發生了什麼,但如果您使用具有合成訪問器的屬性,則不必經常寫它。

0

您必須從所有權角度考慮iPhone內存管理。如果你擁有一個變量的所有權,你需要「保留」它。如果你保留一個對象,你需要釋放它。所以你看不到的代碼是調用setOldAmount的人。無論誰調用setOldAmount最有可能創建newAmount。當你分配一個變量時,它隱式設置爲在給予你之前保留(否則它將在它到達你之前被釋放,這將是愚蠢的)。當你不再關心它的價值時,釋放它是你的工作。所以是的,如果誰調用setOldAmount從不發佈newAmount,但是上面的代碼是正確的,那麼可能會發生內存泄漏。