2012-02-28 54 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