0

次のコードは、メイン スレッドのタイムアウトと強制終了されたアプリを含むシナリオを作成しました。正確な理由はわかりません。

このメソッドはメイン スレッドによって呼び出され、スタック トレースによると、この呼び出しは同期的ではありません (main.m から直接起動されます)。しかし、実行に 20 秒以上かかるのはなぜでしょうか? このイベントは、タイマーが起動した後にのみデキューされませんか?

[fooObj performSelector:@selector(populate) withObject:nil afterDelay:2];

クラッシュログ:

経過合計 CPU 時間 (秒): 20.060 (ユーザー 20.060、システム 0.000)、100% CPU 経過アプリケーション CPU 時間 (秒): 19.438、97% CPU

スレッド 0 の名前: ディスパッチ キュー: com.apple.main-thread スレッド 0: 0
CoreFoundation 0x3ad408b4 CFArrayGetFirstIndexOfValue + 348

1 CoreFoundation 0x3ad46e88 CFRunLoopRemoveTimer + 224

2 CoreFoundation 0x3ad46d00 CFRunLoopTimerInvalidate + 324

3 MyApp 0x00034b94 - [コンテナクリア] (Container.m:147)

4 MyApp 0x000348aa -[コンテナに入力] (Container.m:77)

5 MyApp 0x00034f62 -[BaseContainer populate] (BaseContainer.m:75)

6 Foundation 0x35bfaa6a __NSFireDelayedPerform + 446

7 CoreFoundation 0x3add45dc CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION + 12

8 CoreFoundation 0x3add428c __CFRunLoopDoTimer + 268

9 CoreFoundation 0x3add2efc __CFRunLoopRun + 1228 10

10 CoreFoundation 0x3ad45eb8 CFRunLoopRunSpecific + 352

11 CoreFoundation 0x3ad45d44 CFRunLoopRunInMode + 100

12 GraphicsServices 0x391132e6 GSEventRunModal + 70

13 UIKit 0x33f852f4 UIApplicationMain + 1116

14 MyApp 0x000029c6 メイン (main.m:14)

同じ理由による別のクラッシュ: MT タイムアウト。(ログから、スレッド 0 が自身のミューテックスが解放されるのを待っているようです。ログのデッドロックまたは誤読ですか?)

経過合計 CPU 時間 (秒): 20.060 (ユーザー 20.060、システム 0.000)、100% CPU 経過アプリケーション CPU 時間 (秒): 18.175、91% CPU

スレッド 0 名: ディスパッチ キュー: com.apple.main-thread スレッド 0:

0 libsystem_kernel.dylib 0x32af50fc __psynch_mutexwait + 24

1 libsystem_c.dylib 0x35e56124 pthread_mutex_lock + 388

2 CoreFoundation 0x3ad46df8 CFRunLoopRemoveTimer + 80

3 Foundation 0x35bfaa20 __NSFireDelayedPerform + 372

4 CoreFoundation 0x3add45dc CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION + 12

5 CoreFoundation 0x3add428c __CFRunLoopDoTimer + 268

6 CoreFoundation 0x3add2efc __CFRunLoopRun + 1228

7 CoreFoundation 0x3ad45eb8 CFRunLoopRunSpecific + 352

8 CoreFoundation 0x3ad45d44 CFRunLoopRunInMode + 100

9 GraphicsServices 0x391132e6 GSEventRunModal + 70

10 UIKit 0x33f852f4 UIApplicationMain + 1116

11 ハーツ オブ スペース 0x000029c6 main (main.m:14)

12 宇宙の心 0x00002980 0x1000 + 6528

編集: clear と populate の impl を追加しました。ご覧のとおり、ブロッキング コールはありません。

- (void)clear
{
    self.m_msdData = [NSMutableData dataWithLength:0];
    self.m_maItems = [NSMutableArray arrayWithCapacity:0];
    self.m_mdItems = [NSMutableDictionary dictionaryWithCapacity:0];
    [m_timer invalidate];
    self.m_timer = nil;
    self.m_nsUrlConnection = nil;

    // zz Don't change the property state, in case an observer is already listening.
    m_nState = CS_UNPOPULATED;
}


- (CONTAINER_STATE)populate
{
    [self clear];

    self.m_timer = [NSTimer scheduledTimerWithTimeInterval:TIME_OUT_SEC 
                                target:self 
                                selector:@selector(timeout) 
                                userInfo:nil 
                                repeats:NO];

    self.m_nState = CS_POPULATING;

    return CS_POPULATING;
}
4

0 に答える 0