2012-02-28 53 views
0

我有音頻類,採樣緩衝區和NSNotification它調用另一個類,併發送一個數據(int)。autoreleased沒有池警告?

我得到這個WARNNING運行很多很多次第二:

class __NSCFNumber autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() 

class __NSCFString autoreleased with no pool in place - just leaking - break on objc_autoreleaseNoPool() to debug 

這是什麼意思? 是的,我有NSNumber該類和NSString。 他們沒有分配。

我需要另一個線程嗎? 最新錯誤?

謝謝。

+1

當你在'objc_autoreleaseNoPool()'上放置一個斷點時會發生什麼?堆棧顯示了什麼? – user1118321 2012-02-28 17:18:51

+0

如何將斷點放在objc_autoreleaseNoPool() – 2012-03-17 02:25:05

回答

1

這意味着,無論代碼在哪個線程上運行,在代碼運行之前都沒有設置autorelease pool。對於基於AppKit或UIKit的應用程序,框架通常在主線程上爲您管理一個,但如果您使用其他線程,則仍然需要自己創建它們。對於不基於AppKit或UIKit的應用程序,在運行Objective-C代碼時,幾乎總是需要確保有一個自動釋放池。

+0

如果您使用ARC並且這種情況仍在發生,該怎麼辦?我有這個問題,但Xcode不會讓我添加一個NSAutoreleasePool。 – Justin 2013-03-12 00:22:25

+0

@Justin:'@ autoreleasepool'指令應該可以工作。不是嗎? – Chuck 2013-03-12 02:25:45

+0

是的,它的確如此。感謝那。 – Justin 2013-03-14 15:06:33

1

你在應用程序的main()函數中使用了autorelease池嗎?你使用autoreleased實例(是的,我知道,你沒有alloc-init它們,但[NSNumber numberWith ...]返回一個alloc-init-autoreleased對象)在主線程以外的線程?如果您最初沒有設置自動釋放池,或者您正在使用多個線程,則必須爲每個線程創建一個單獨的NSAutoreleasePool。

+1

除了以這種方式創建對象之外,還有許多原因可以使對象自動釋放 - 例如,許多訪問器實現會自動釋放對象。 getter的最安全版本(我認爲它被合成訪問器使用)可以用來返回[[ivar retain] autorelease]。在沒有使用自動釋放池的情況下運行任意基於Foundation的代碼通常是不安全的。 – Chuck 2012-02-28 17:43:58

+0

是的。但我不會說最安全的getter返回retain-autorelease。如果一個對象不存在,人們不應該期望它的屬性存在,所以這是一種「濫用」或「過度使用」安全。 – 2012-02-28 18:12:41

+0

這是蘋果認可的做法,所以我幾乎不會稱之爲「濫用」。無論如何,這是很常見的,所以我不想編寫代碼,當它遇到這個習慣用法時會出現錯誤。 – Chuck 2012-02-28 18:34:22