0

NSOperation と NSOperationQueue を使用してテスト プロジェクトを作成しました。テキストボックスは 1 つだけです。@property (weak) IBOutlet NSTextField *textbox;

バックグラウンドでこれが実行されます。

- (void)main
{
    NSURL *url = [NSURL URLWithString:@"http://google.com"];
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request startSynchronous];
    NSError *error = [request error];
    if (!error) {
        NSString *response = [request responseString];
        NSLog(@"MainThread: %@", ([NSThread isMainThread] ? @"YES" : @"NO"));
        [[AppDelegate sharedManager] performSelectorOnMainThread:@selector(pageLoaded:)
                                           withObject:response
                                        waitUntilDone:NO];
}

メインスレッドで呼び出されるセレクター:

- (void)pageLoaded:(NSString*)document
{
    [textbox setStringValue:document]; // does nothing
    NSLog(@"Textbox: %@", textbox); // returns nil
}

テキストボックスがnilを返すのはなぜですか?

4

1 に答える 1

0

うーん、私には 2 つのアイデアがあります。

  1. 現実的なもの:[AppDelegate sharedManager]呼び出したオブジェクトとは異なるオブジェクトを返しますapplicationDidFinishLaunching。AppDelegate が XIB + に追加されている場合、別のシングルトン インスタンスが存在する可能性があります。
  2. 神秘的なもの: AppDelegate は 1 つしかありませんが、プロパティ値が何らかの理由で無効になっています。この場合、問題を解決する最も簡単な方法は、setTextboxを再定義して呼び出し元を見つけるよりも、"weak" を "assign" に変更することです (リリースの問題かどうかを調べるため)。

でも間違いなくナンバー1です。

于 2012-08-30T11:52:28.700 に答える