2011-05-23 36 views
1

我正在嘗試從谷歌示例線程程序,我得到一個運行時異常。未捕獲異常'NSInvalidArgumentException' - >目標C

是否有任何網站提供瞭如何與線程一起使用runloop的示例。 我需要設置兩個事件併產生一個線程並且並行地完成另一個功能。

// Runner.m 

#import "Runner.h" 

@implementation Runner 

    - (void)rumMe:(id)ignored { 

     NSLog(@"Running with threads!!"); 
    } 

@end 

// Runner.h 

@interface Runner : NSObject 

    -(void)rumMe:(id)ignored; 

@end 

// Thread1.m 

#import <Foundation/Foundation.h> 
#import "Runner.h" 

int main (int argc, const char * argv[]) { 

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    Runner* runner = [Runner new]; 
    [NSThread detachNewThreadSelector:@selector(runMe:) toTarget:runner withObject:nil]; 
    [pool drain]; 
    return 0; 
} 

運行時異常:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** 
-[NSThread initWithTarget:selector:object:]: target does not implement selector (*** 
-[Runner runMe:])' 
+0

好吧,看了一下,你大概可以用新的,這樣不是問題 – James 2011-05-23 07:21:13

+2

這是一個錯字。看看你的方法聲明:'ru' m'我:'和'detachNewThreadSelector:'的參數。 'ru' n'Me' – 2011-05-23 07:25:06

+0

@Josh:我傳遞給detachNewThreadSelector的參數是(runMe :)而不是(runMe) – spandana 2011-05-23 07:29:57

回答

2

第一部分:你有一個錯字

// method declaration 
rumMe: with an _m_ 
// call 
runMe: with an _n_ 

第二部分:您的主要功能是返回並導致程序退出你給線程有機會做任何事情之前。在這個簡單的簡單的例子,你可以簡單地

sleep(2); 

調用detachNewThreadSelector:

在更復雜的情況下正確後,您可能需要撥打電話到CFRunLoopRun();在主線程,或採取其他措施以保持第二個線程活着。

+0

凱斯韋爾:感謝讓我瞭解線程。將繼續推進Threading中的一些複雜程序。 – spandana 2011-05-23 08:32:21

+0

@ron:不客氣,祝你好運! – 2011-05-23 08:33:07

1

你已經做了一個錯字。 Runner中的方法定義爲rumMe,但在主程序中使用runMe

相關問題