0

CPP コードと統合された 1 つの iPhone アプリケーションを作成しています。Objective-C と CPP コードの間の共通インターフェイスとして C インターフェイス ファイルを使用しています。

次のコードを使用して、現在のビューから新しいビューを表示しようとしています:

viewTowController *screen = [[viewTwoController alloc] initWithNibName:nil bundle:nil];
[self presentModalViewController:screen animated:YES];

私は以前にもこのコードを使用しましたが、それはボタンクリックイベントであり、完全に正常に機能しましたが、CPP コードから生成されたイベント (CPP から呼び出されるコールバック関数) に基づいていくつかのビューを表示する必要があります。

以下のような CPP コールバック関数からこのコードを呼び出すと:

-(void) displayView
{
    viewTwoController *screen = [[viewTwoController alloc] initWithNibName:nil bundle:nil];
    [self presentModalViewController:screen animated:YES];
}

//-- C Interface Function Implementation --//
void onDisplayView(void *self)
{
    [(id) self displayView]; 
}

ビューが画面に追加されたことを確認できず、コンソール ログ ウィンドウに以下のエラーが多数表示されます。

2012-12-18 18:03:02.128 p2pwebrtc[5637:5637] *** _NSAutoreleaseNoPool(): Object 0x4f04520 of class UIView autoreleased with no pool in place - just leaking
Stack: (0x305a2e6f 0x30504682 0x309778ac 0x7db6 0x7d28 0x33bb 0x6fb0 0x1af865 0x1afb4a 0x1afc5e 0x62a1 0x373e 0x4672 0x39937f 0x3ca1e4 0x3ca265 0x3cc6 0x926d8155 0x926d8012)

私はこれで何か間違ったことをしていますか、それとも他の方法がありますか?

アップデート **

回答で示唆されているように、UI スレッドでこのコードを実行する必要があり、そのためには以下のコードを実行する必要があります。

dispatch_async(dispatch_get_main_queue(), ^{
    [(id) self displayView];
});

Objective-C 関数または CPP 関数でこのコードを呼び出すと、 ERROR が発生し'dispatch_get_main_queue' was not declared in this scopeます。

また、OSXバージョン10.5.8とXcodeバージョン3.1.3を使用しています

4

1 に答える 1

1

次のように、メイン スレッドで UIKit を呼び出していることを確認します。

void onDisplayView(void *self) {
    dispatch_async(dispatch_get_main_queue(), ^{
        [(id) self displayView];
    });
}

古いバージョンの iOS (GCD より前) をターゲットにしている場合は、代わりにこれを行うことができます

// assuming `self` inherits from NSObject, of course
void onDisplayView(void *self) {
    [self performSelectorOnMainThread:@selector(displayView) withObject:nil waitUntilDone:NO];
}
于 2012-12-18T12:56:59.330 に答える