-2

そのため、記録のために、この問題について何日も検索しました。最後に、私は立ち往生しているポイントにいます。私は Threading プログラミング ガイドを読み、NSRunLoops について説明されているときに注意深くフォローしました。問題は次のとおりです。

AppDelegate と TestObj というクラスだけで構成される非常に単純なデモ プロジェクトがあり、testObj 内にあります。

@implementation TestObj

-(void)executeTheTaskWithObj:(id)sender {

NSTask *task = [[NSTask alloc] init];
[task setLaunchPath: @"/bin/sh"];
NSArray *arguments = [NSArray arrayWithObjects: @"-c", @"echo hello", nil];
[task setArguments:arguments];

    /* This works but I want to handle the notification in this class, not the senders     class */
//[[NSNotificationCenter defaultCenter] addObserver:sender    selector:@selector(taskComplete:) name:NSTaskDidTerminateNotification object:task];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(taskComplete:) name:NSTaskDidTerminateNotification object:task];
[task launch];
}

-(void)taskComplete:(NSNotification *)notification {
NSLog(@"Task Complete");
}

このクラスは私の appDelegate によって呼び出されます

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
TestObj *myObj = [[TestObj alloc] init];
[myObj executeTheTaskWithObj:self];
}

したがって、問題はアプリケーションが「objc_msgSend ()」でクラッシュすることです。ブレークポイントは、オブザーバーとして「self」を追加するとすぐに爆発することを証明しています。とにかく、これを意図的にマルチスレッド化していません。これは単なる通常の呼び出しです。したがって、私の最初の直感は、おそらく NSRunLoop のインスタンスを使用する必要があるということでした。そこで、スレッド化プログラミング ガイドの NSRunLoop セクションを読んだところ、cocoa アプリケーションではメインで自動的に実行ループが開始されることが明示的に示されています。別のものを作成する必要はありませんよね?質問への回答は必要ありませんが、これを解決する方法について少なくともいくつかのガイダンスが必要です。ありがとうございました!

4

1 に答える 1

1

問題は、applicationDidFinishLaunching が範囲外になった後に myObj の割り当てが解除されることです。強力なプロパティ myObj を作成すると、適切に機能するはずです。

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    self.myObj = [[TestObj alloc] init];
    [self.myObj executeTheTaskWithObj:self];
}
于 2013-07-12T02:24:26.637 に答える