NSAlertウィンドウを表示しているマルチスレッドOSXアプリケーションがあります。ほとんどの場合、UIは問題ないように見えますが、非常に見苦しいボタンを置き忘れてUIが機能しなくなることがあります。

メインスレッドをブロックできず、モーダルとして表示したくないので。私は次のコードを使用しています。
NSAlert* alert = [NSAlert alertWithMessageText:title defaultButton:defaultBtn alternateButton:alterBtn otherButton:otherBtn informativeTextWithFormat:msg];
[alert setAlertStyle:style];
BOOL isMainThread = (dispatch_get_current_queue() == dispatch_get_main_queue());
if(isMainThread)
    [alert layout];
else
{
    dispatch_sync(dispatch_get_main_queue(), ^{
        [alert layout];
    });
}
NSModalSession session = [NSApp beginModalSessionForWindow:alert.window];
__block NSUInteger response;
for (;;) {
    if(isMainThread)
    {
        response = [NSApp runModalSession:session];
    }
    else
    {
        dispatch_sync(dispatch_get_main_queue(), ^{
            response = [NSApp runModalSession:session];
        });
    }
    if(response != NSRunContinuesResponse)
        break;
}
なぜこれが起こっているのか考えていますか?