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

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

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

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

【问题讨论】:

    标签: iphone objective-c multithreading nsautoreleasepool


    【解决方案1】:

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

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

    ...线程体...

    [池释放];

    【讨论】:

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