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 - Tableview 中的多线程 - 可行的方法?
iPhone:在多线程环境中发布 UIViewController 时出现问题