2011-01-22 69 views
8

我的應用程序結構如下, 最核心的部分是用C++編寫,並使用線程嚴重,我發展目標C UI在它的上面, 如果我不執行它正常工作的線程,但我不能禁用,停止線程,UI是「自動釋放沒有合適的泳池」是什麼意思?

__NSAutoreleaseNoPool(): Object 0x350270 of class NSCFString autoreleased with no pool in place - just leaking 

類似的消息來了,曾多次通過谷歌搜索來了解 日誌我可以看到隨機崩潰,下面的消息,我需要設置NSAutoReleasePool擺脫但是如何將其與C++代碼集成在一起呢?

編輯:核心LIB將從UI被激活,因此,我想,其安全地說UI是在主線程中運行,庫正在創建/無在這種情況下,通知UI, 終止線程,我可以打電話AutoReleasePool在UI

任何人都可以指導我?

回答

7

見這些文檔你應該知道與可可多線程什麼:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafetySummary/ThreadSafetySummary.html

它的美好就像你要設計你的應用程序,但兩件事情應該牢記:

  1. 生活是簡單的(有時是必要的),當在主線程上操縱視圖(AppKit或UIKit)等UI控件時。您可以在後臺線程上使用Foundation對象和一些AppKit/UIKit對象,並且可以從多個線程使用某些Foundation對象。
  2. 如果你使用任何Cocoa對象都在後臺線程,你需要設置自動釋放池的那些線程。

像這樣:

- (void)backgroundThreadStart 
{ 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    // do stuff 

    [pool release]; 
} 

這將解決您的控制檯錯誤,但你可能有導致實際崩潰你看到其他的問題。

+0

你好,讓我試着在我的問題中添加更多內容 – Amitg2k12 2011-01-22 16:47:44

1

這意味着你自動釋放一些沒有到位自動釋放池。

每個線程都有自動釋放池的堆棧。在主線程中,在Cocoa調用代碼之前爲您創建一個自動釋放池,並在代碼返回後排空。您自動釋放的每個對象(無論是顯式還是隱式)都會進入池中,以便在池被耗盡時池會釋放它。當你創建一個線程時,你必須自己在該線程上創建並刪除一個自動釋放池。當如果你決定運行垃圾收集在你的代碼(或只是不自動釋放任何東西,但對於代碼的任何有意義的量是幾乎不可能的。)

,你需要發送池drain,不release,你已經完成了,因爲池是有用的。當啓用GC時,releaseautorelease消息什麼也不做 - 它們甚至不通過。您的自動釋放池將通過戳動垃圾回收器來響應drain,這是最接近釋放池中物體的等價物。

The Memory Management Programming Guide for Cocoa大約有自動釋放池,除其他事項外的更多信息。