Я создаю NSTimer и добавляю его в цикл запуска фонового потока.Мой код похож на пример фонового потока для этого ответа: iPhone-SDK: вызвать функцию в фоновом режиме?
После создания таймера и привязки его к циклу выполнения из gdb I po runLoop
и выводит это:
<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 I po runLoop
снова это выглядит так:
<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 = ()}
},
}
}
Теперь запись "таймеры" содержит 0 объектов.Но поток продолжает работать.Я часто покидаю экран, затем возвращаюсь, так что это приводит к созданию фоновых потоков, которые в конечном итоге убивают приложение после слишком большого количества ресурсов.Таймеры не запускаются после того, как они становятся недействительными, но фоновый поток остается.
Я знаю, что могу переместить таймеры обратно в основной поток или создать свой собственный простой поток таймеров с помощью NSThread sleepForTimeInterval, но я хотел бы сохранитьосновной поток для обновления графического интерфейса и используйте NSTimer, если это возможно.