-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 部分,它明确指出可可应用程序在 main 中自动启动了一个 runloop。所以我不应该再创造一个吧?我不想回答这个问题,但至少有一些关于如何解决这个问题的指导。谢谢!

4

1 回答 1

1

问题是 myObj 在 applicationDidFinishLaunching 超出范围后被释放。创建一个强大的属性 myObj,然后它应该可以正常工作。

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