iPhone 开发多线程,NSAutoreleasePool

Posted

技术标签:

【中文标题】iPhone 开发多线程,NSAutoreleasePool【英文标题】:iPhone dev multi threaded, NSAutoreleasePool 【发布时间】:2009-10-01 01:32:36 【问题描述】:

我有一个简单的应用程序,它倒计时到午夜,然后一遍又一遍地播放哔哔声,并闪烁显示时间的标签。所以标签闪烁使用了一个NSTimer,而哔哔声在它自己的Thread上进行,这样纯C函数(用于系统声音id完成回调)可以使用[NSThread sleepForTimeInterval:...];在播放警报哔声之间稍等片刻。所以我在执行过程中收到两条错误消息,说没有自动释放池,它只会泄漏。这是因为在我调用新线程的方法中,有两个 @"Strings" 用于创建系统声音 ID(文件名和扩展名)。有没有办法我不能使用自动释放池,因为这是唯一尝试使用它的两件事。谢谢。

或者我应该使用两个 NSTimers 而不是另一个线程..?

Ben Gottlieb 的回答是对的,但是我决定改用另一个 NSTimer,因为我忘记了它是如何与您休眠线程的时间真正同步的,因为它需要一些时间才能真正执行代码。它使事物对称;)。

【问题讨论】:

【参考方案1】:

只需在你的线程方法中创建一个自动释放池:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

...线程体...

[池释放];

【讨论】:

这和[pool drain];有什么区别? -drain 方法是较新的首选方法,它也可以很好地处理垃圾回收。我相信该方法在 10.4+ 上可用。 -drain 在 iPhone 上运行良好,这是一个很好的习惯。 为什么所有项目中自动生成的main.m都使用[pool release];?以及当前线程如何知道使用这个我们可以命名的自动释放池? NSTimer 是如何只使用当前线程的呢?我测试了一些[NSThread isMainThread]; 语句,它们总是正确的,即使在计时器方法中也是如此。另外,我注意到每当我调用[NSThread isMultiThreaded]; 时它都会返回true。这仅仅是因为它在模拟器中吗?

以上是关于iPhone 开发多线程,NSAutoreleasePool的主要内容,如果未能解决你的问题,请参考以下文章

关于 iPhone 上的多线程

iPhone - Tableview 中的多线程 - 可行的方法?

iPhone:在多线程环境中发布 UIViewController 时出现问题

iOS中多线程原理与runloop介绍

iphone - 如何防止应用程序在下载数据时被阻止[关闭]

CoreData 和一对多关系的并发错误