3

UIKitにまったく依存しないカスタムiPhoneアプリケーションがあります(UIKitにリンクされていません)。これは、UIApplicationを使用していないため、 UIApplicationMainを呼び出していないことを意味します。

問題は、タイマーを作成しても起動しないことです。タイマーは次のように作成されます。

[NSTimer timerWithTimeInterval:10 target:self selector:@selector(updateTime) userInfo:nil repeats:TRUE];

「 main()」で基本的な初期化を完了した後、次のように実行すると、問題が実行ループに関連している可能性があると思われます。

NSLog(@"Starting application ...");
applicationInstance = [MyApp alloc];
[applicationInstance setMainLayer:mainLayer];
[NSThread detachNewThreadSelector:@selector(runApplication) toTarget:applicationInstance withObject:nil];

CFRunLoopRun();

UIKitをリバースエンジニアリングしたところ、UIApplicationがシステムイベントの登録など、はるかに多くのことを実行していることに気付きました。NSTimerはそれらの1つに依存している可能性があります。私が気付いたもう1つのことは、UIApplicationのデリゲートでは、スレッドがmain()と同じであるということです。

NSTimerを正しく動作させるにはどうすればよいですか?実行ループに関連している場合、誰かがエラーを指摘できますか?「CFRunLoopRun()」は、アプリケーションの残りの部分を実行できるようにメインスレッドを切断するために使用されます。私はそれが正しいとは思いません。

編集:実行ループを構成する必要があると思います。何とかして ...

4

2 に答える 2

4

あなたの問題は間違いなく実行ループ関連です。NSTimer リファレンス、具体的には紹介を参照してください。

タイマーは実行ループと連携して機能します。タイマーを効果的に使用するには、実行ループがどのように動作するかを認識しておく必要があります。「NSRunLoopおよびThreading Programming Guide 」を参照してください。特に、実行ループはタイマーを保持するため、タイマーを実行ループに追加した後にタイマーを解放できることに注意してください。

于 2010-07-18T19:39:13.020 に答える
3

解決策は非常に簡単でした

NSTimer * timeUpdateTimer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(updateTime) userInfo:nil repeats:TRUE]; 
[[NSRunLoop mainRunLoop] addTimer:timeUpdateTimer forMode:NSDefaultRunLoopMode];

シャギーフロッグのヒントをありがとう

于 2010-07-18T20:58:11.363 に答える