2016-02-12 65 views
1

我在代碼中混合了一些ObjectiveC和C++。 (我的文件是.mm文件而不是.m。)什麼時候用@autoreleasepool來包裝任何代碼塊的正當理由?不知道我在做什麼,我正在包裝任何可能包含任何非ObjectiveC變量的代碼塊,無論它是int,charstd::string,還是任何非ObjectiveC變量的指針。所以,我的C++類中的每個類方法都有一個@autoreleasepool包裝器。@autoreleasepool的正確用法

我做錯了嗎?

請注意,在前面的問題中,有些涉及到這個問題,他們討論了使用alloc,init和release,而現在這些在XCode7 +中似乎不再使用。所以,我需要最新的建議,而不是老的建議。我需要關於XCode7或更高版本的建議。

+0

您不必在@ autoreleasepool中包裝您的調用 - 每個線程都會自動創建一個。如果你在一個不是主線程的線程上,你可能需要創建一個autoreleasepool。 – nielsbot

+0

在任何情況下,如果嘗試在沒有自動釋放池的情況下自動釋放對象,則會在控制檯中獲得打印的警告 – nielsbot

+0

爲什麼在創建控制檯應用程序時,默認情況下會添加@autoreleasepool塊它創建的main.m,然後呢? – Volomike

回答

1

自動釋放池是用於限制的東西,是在其內部autorelease d的壽命。 autorelease是一個Cocoa Objective-C API,所以只有Objective-C代碼可以autorelease的東西。因此,將一個自動釋放池放在一塊純C/C++代碼中,您肯定永遠不會調用Objective-C代碼,這絕不會有任何意義。

自動釋放池通常僅適用於您有循環運行多次的情況,其中每次迭代可能執行大量autorelease。請注意,並非所有Objective-C代碼都將爲autorelease;這並不明顯。一些可可API將autorelease和一些不會。如果這是用ARC編寫的所有代碼,它可能不是autorelease

+0

好的,如果我有一個C++函數,我什麼時候需要釋放這些變量?我只是害怕從其他程序員那裏聽到的內存泄漏,甚至不知道如何檢測這些內存泄漏。 – Volomike

+0

@Volomike:你是什麼意思「釋放這些變量」? 'retain' /'release'是Objective-C對象的Cocoa API。你不能「保留」/「釋放」其他任何東西。 – newacct

-1

如果您使用了AppKit,您不必創建自動釋放池:

的應用套件在 創建主線程自動釋放池事件循環的每個週期的開始,並在 一端排空,從而釋放任何自動釋放的對象,同時處理一個事件,同時生成 。如果您使用應用套件,則您通常不需要創建您自己的池。但是,如果您的應用程序 在事件循環中創建了大量臨時自動發佈的對象,但是,創建「本地」自動釋放池到 可能有助於最大限度地減少峯值內存佔用量。

link

+0

僅僅因爲運行循環的每次迭代都有一個自動釋放池並不意味着你不想在自己的代碼中的某些地方放置自己的自動釋放池。 – newacct

+0

確實 - 不完整的答案。我會擴大它。 – nielsbot

+0

你是否倒下了它? – nielsbot