2012年11月12日月曜日

iOS6非互換:NSTimerの挙動!?(原因判明)

アップルの技術者の皆様、XcodeやiOS6を疑って申し訳ございませんでした。(^^ゞ

原因が分かりました。 私のコーディング上の問題でした。

iOS6から生成したビューに対して「removeFromSuperview」が何故か呼び出されるようになっているため、このメソッドをオーバーライドしてNSTimerの停止処理(停止後、開放される)を組み込んでいたのでビュー生成後の初期処理内でNSTimerを生成して起動した直ぐ後に「removeFromSuperview」が呼び出されたため、NSTimerを停止しておりました。

メンバー変数「mTimerTask」に代入した場合のみタイマー停止処理が行われますが、代入しない場合はタイマー処理の参照が無いので停止されないので代入の有無で挙動が変わっていたようです。

対応としては「removeFromSuperview」のオーバーライドを止めて別のメソッドでタイマー処理を停止するよう修正したところ正常に動作するようになりました。

うーん、結構ハマってしまいました。

1 件のコメント:

  1. でも、UIView内で生成したNSTimer(repeat:YES)を停止(破棄)するタイミングは「removeFromSuperview」をオーバーライドするのがTipsだったので、同様な現象が出ている人も多いような気もしますがどうなんでしょ。

    返信削除