簡體   English   中英

iPhone:使用保留vs自動釋放

[英]iPhone: using retain vs autorelease

哪個是更好的做法?

A)稍后自己保留並釋放對象

NSMutableArray* array = [[self getArray] retain];
....
[array release];

B)從返回對象的函數中自動釋放

getArray {
   NSMutableArray* returnedArray = [[[NSMutableArray alloc] init] autorelease];
   .....
   return returnedArray;
}

關於Objective-C中的內存管理,最簡單的經驗法則是,您應釋放任何已明確分配(分配),復制(復制),更新(新)或保留(保留)的內容。

釋放應在上述動作的范圍內完成。 如果為方法返回的對象分配空間,則應在釋放它之前自動釋放它。 因此,考慮到您提供的兩個選項,建議您使用B。

如果要返回對象,則必須使用第二種方法。 在所有可能的情況下,都應使用保留釋放方法,因為這會占用較少的內存。

您可以閱讀並遵循Apple關於內存管理性能的准則。

我個人認為選擇其中一種方法的原因是:

使用自動發行專家:

  • 您無法將其填滿,內存將在某個時候釋放。 我想將其視為“成功之路”。

缺點:

  • 大量使用自動釋放可能會導致內存問題,因為大量對象堆積起來,等待自動釋放池釋放。

使用保留/發布專家:

  • 使用/釋放內存時的更多控制。
  • 在ios上,Apple建議您盡可能使用release而不是autorelease來保持池的大小較小。

缺點:

  • 像C / C ++ malloc / free new / delete一樣,您必須小心保持它們匹配,並且很容易將其塞滿,從而導致內存泄漏。
  • 對於成員變量,您別無選擇,保留還是釋放。

我認為,無論選擇哪種樣式,都取決於您的代碼所處的情況,並根據優缺點選擇最佳樣式。 我認為對此沒有任何答案。

  1. 如果您newalloc initretaincopy (NARC)對象,則必須釋放它。
  2. 如果方法的名稱以任何這些詞開頭,則表示該方法是為調用方創建的,調用方負責在完成處理后release對象。
    否則,返回的方法不歸調用方所有,並且他必須指示他要保持該方法的調用,方法是retain對象。
  3. 如果可以選擇,請在擔心內存時不要濫用自動釋放功能。

一些評論:

  • 第一條規則在邏輯上導致第二條。 示例:如果某個函數(返回的對象)的結果在函數執行后仍然存在,則該函數所能做的就是自動釋放該對象。
  • 除非存在內存/性能方面的問題,否則自動內存管理的開銷要好於內存泄漏的機會再加上開發時間。
  • 嘗試對稱地保留/釋放。 示例:如果您保留init,則在dealloc上釋放。 與viewDidLoad / viewDidUnload相同。
  • 如果使用@property(retain),則必須在dealloc中釋放。

例:

 // created with autoreleased, just call retain if you intend to keep it
 NSString *orange = [NSString stringWithString:@"orange"];
 // created for the caller, you'll have to release it when you are done
 NSObject *apple = [NSString initWithString:@"apple"];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM