2014-02-18 79 views
1

我是新來的Objective C,我正在將舊的(非ARC)框架的部分移植到ARC。我的問題是,儘管ARC現在在幕後處理了大量內存管理,但是我仍然需要了解哪些主要的內存管理原則以避免泄漏?Objective C內存管理與ARC

例如我以爲我讀過某處在NSOperation子類的'main'函數中,程序員應該爲該函數設置'autoreleasepool'。

+1

我的書中列出了一些常見的陷阱:http://www.apeth.com/iOSBook/ch12.html#_unusual_memory_management_situations(有關不常見的內存管理情況的章節,以及關於保留週期的註釋) – matt

+0

我不同意這兩個「太廣泛」的選票,儘管這可能確實是重複的。 –

+0

徵求這種「陷阱」或「特徵」信息的問題[在Stack Overflow上不能很好地工作](http://meta.stackexchange.com/a/76492/159251);沒有人會回答這個問題的確切和完整。我們[最終得到一個同樣有效的列表](http://meta.stackexchange.com/a/56773/159251)論壇式的帖子,而不是一個可讀的問題。因此,「太寬泛」。 @JasperBlues –

回答

1

程序員仍然需要100%知道保留/釋放,但是,編譯器正在完成98%的工作。 2%不能很好地打破保留週期,所以編譯器在屬性中指定弱保留或在選定場景中使用__weak修飾符會很有幫助。

您仍然可以設置自己的@ autoreleasepool's。我唯一一次有目的地使用它們是作爲for循環的主體,以強制每次迭代回收內存。

2

可能要注意的兩個最大問題是1)保留週期,其中x保留y和y保留x,因此它們永遠不會被釋放。這通常發生在塊。 2)使用Core Foundation功能(Core Graphics等)時,例如:CGImageCreate,CGImageRetain,CGImageRelease。在這些情況下,您仍然需要手動管理內存。

防止保留週期的常見模式是爲週期中的某個對象創建一個弱引用。 (通常是自我)。像這樣的:

__weak typeof(self) weakSelf = self; 
[self useBlock:^{ 
    typeof(weakSelf) strongSelf = weakSelf; 
    // do something with strongSelf 
}]; 

注: 一)要創建的塊中新strongSelf究其原因,是爲了確保您保留對塊的持續時間weakSelf變量。否則,您可能會遇到weakSelf將無法通過該塊的情況。在某些情況下,您可能想要添加一個strongSelf立即仍然存在的測試,並且如果不是完全放棄該塊。因爲弱者在塊開始之前可能會變成零。你只需要這樣做時,自我將保留塊(在這種情況下,通過未知的useBlock方法正在做的事情)。