NSTimer无效后,后台线程NSRunloop运行不会退出!为什么?
|
我正在创建一个NSTimer并将其添加到后台线程的运行循环中。
我的代码类似于此答案的后台线程示例:iPhone-SDK:在后台调用函数?
创建计时器并将其从gdb附加到runloop后,我I0ѭ并输出以下内容:
<CFRunLoop 0x695b090 [0x16a62c0]>{wakeup port = 0x6907, stopped = false,
current mode = kCFRunLoopDefaultMode,
common modes = <CFBasicHash 0x6936e60 [0x16a62c0]>{type = mutable set, count = 1,
entries =>
1 : <CFString 0x16abba8 [0x16a62c0]>{contents = \"kCFRunLoopDefaultMode\"}
}
,
common mode items = <CFBasicHash 0x695e160 [0x16a62c0]>{type = mutable set, count = 1,
entries =>
0 : <CFRunLoopTimer 0x69398a0 [0x16a62c0]>{valid = Yes, interval = 6, next fire date = 329774303, callout = __NSFireTimer (0x212399), context = <CFRunLoopTimer context 0x6903a10>}
}
,
modes = <CFBasicHash 0x6904120 [0x16a62c0]>{type = mutable set, count = 1,
entries =>
1 : <CFRunLoopMode 0x6946180 [0x16a62c0]>{name = kCFRunLoopDefaultMode, port set = 0x6807, timer port = 0x6b03,
sources0 = (null),
sources1 = (null),
observers = (null),
timers = <CFArray 0x695e180 [0x16a62c0]>{type = mutable-small, count = 1, values = (
0 : <CFRunLoopTimer 0x69398a0 [0x16a62c0]>{valid = Yes, interval = 6, next fire date = 329774303, callout = __NSFireTimer (0x212399), context = <CFRunLoopTimer context 0x6903a10>}
)}
},
}
}
这表明1个计时器已附加到运行循环
稍后在使计时器无效之后,NSRunloop运行方法不会退出,但是在我暂停调试器并从gdb中再次弹出“ 0”后,它看起来像这样:
<CFRunLoop 0x695b090 [0x16a62c0]>{wakeup port = 0x6907, stopped = false,
current mode = kCFRunLoopDefaultMode,
common modes = <CFBasicHash 0x6936e60 [0x16a62c0]>{type = mutable set, count = 1,
entries =>
1 : <CFString 0x16abba8 [0x16a62c0]>{contents = \"kCFRunLoopDefaultMode\"}
}
,
common mode items = <CFBasicHash 0x695e160 [0x16a62c0]>{type = mutable set, count = 0,
entries =>
}
,
modes = <CFBasicHash 0x6904120 [0x16a62c0]>{type = mutable set, count = 1,
entries =>
1 : <CFRunLoopMode 0x6946180 [0x16a62c0]>{name = kCFRunLoopDefaultMode, port set = 0x6807, timer port = 0x6b03,
sources0 = (null),
sources1 = (null),
observers = (null),
timers = <CFArray 0x695e180 [0x16a62c0]>{type = mutable-small, count = 0, values = ()}
},
}
}
现在\“ timers \”条目具有0个对象。但是线程继续运行。我经常离开屏幕然后返回,这样会导致后台线程的建立,最终这些线程将在使用过多资源后终止应用程序。计时器无效后不会触发,但仍保留后台线程。
我知道我可以将计时器移回主线程或使用NSThread sleepForTimeInterval创建我自己的简单计时器线程,但是我想保留主线程以进行GUI更新,并在可能的情况下使用NSTimer。
没有找到相关结果
已邀请:
3 个回复
寿柬窟年
文档: 从运行循环中手动删除所有已知的输入源和计时器并不能保证运行循环将退出。 您应该使用另一种方法,可能在循环中使用“ 5”,同时使计时器无效,并设置一个标志,指示运行循环应结束。
埃庐
如果您正在编写可能在主线程上运行(并因此使用主运行循环)的代码,则应在执行此操作之前检查看看当前运行循环是否是主运行循环-否则,您将轰炸您的应用程序。
磨标烫徽啪