2011-08-10 123 views
0

我學習OBJ-c和我有一個內存管理問題:釋放對象

說我有一個返回一個NSDictionary的功能,「fDictionary」,

NSDictionary *fDictionary { 
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: 
           [NSNumber numberWithInt:1], @"blah",nil]; 
return dict 
} 

那被稱爲一個特定的方法:

-(int)fNumber { 
    NSDictionary *f = fDictionary(); 
    return [[f objectForKey:@"blah"] intValue]; 
} 

我不清楚是如何/在哪裏我應該釋放NSDictionary對象。

我應該在方法中釋放它還是在函數中自動釋放它?

+1

這就要看'fDictionary'函數的代碼。請張貼它。 – spudwaffle

+0

我編輯的職位包括功能 –

回答

3

如果函數編寫正確,字典是自動發佈的,所以你根本不必釋放它。它將很快通過autorelease池發佈。

您只能釋放您自己保留或複製的內容。這些是你「擁有」的東西。一定不要太早釋放它們。通常的觀點是在它們被分配或保留的功能結束之前,如果它們是本地的。如果他們是伊娃,最好的一點通常是伊娃所屬的階級的分配。

+0

所以,如果我需要回到字典在代碼的其他地方使用,那麼我就需要把它保留下來,而是在上面的例子中我就沒有呢? –

+0

@傑克:沒錯。 –

1

,無需瞭解fDictionary這是很難確定什麼,但遵循的慣例在大多數對象C代碼如下:

  • 你擁有它,如果實例是使用一個alloccopy
  • 創建你擁有它,如果你retain
  • 否則你沒有擁有它

如果不OW ñ它你不應該release它。

因此,按照慣例,該函數將返回一個autorelease d對象,並且在方法中不需要任何額外的管理。

1

一般的規則是,如果你的代碼分配的東西,你需要釋放或自動釋放它。

如果這是別人的功能,你會期望返回的字典是autoreleased - 這是這裏的約定。我會確保fDictionary返回一個自動發佈的NSDictionary。

0

如果您從名稱以「alloc」,「new」,「copy」或「mutableCopy」開頭的方法收到對象,則必須釋放或自動釋放它。否則它已經自動釋放。

如果你保留了某些東西,你必須發佈它,沒有別的東西會爲你做。

每個Obj-C程序員都必須閱讀Memory Management Guide

0

NSDictionary dictionaryWithObjectsAndKeys:(這實際上只是[[[NSDictonary alloc]initWithObjectsAndKeys:, nil]autorelease])返回一個自動釋放NSDictionary。這意味着字典將在電腦決定不再需要時自動發佈。

如果fDictionary()字典是alloc版,您需要手動將其釋放。這是拇指總是返回從功能/方法自動釋放對象的規則,這樣的功能/方法,用戶不必擔心內存管理。