2017-01-16 2 views
0

스레드에서 루프를 실행할 수있는 개체를 만들고 싶습니다. 내가 NSThread를 사용하여 스레드에서 루프를 실행, 때로는 잘 작동하고 때로는 오류 메시지가 나타납니다Objective-c Loop in NSThread

Uncaught exception NSInvalidArgumentException, reason: Tried to add nil value for key 'NSArgumentDomain' to dictionary. 

내가 그것을 어떻게 해결합니까? 또는 NSthread 자습서가 도움이 될 수 있습니다.

#import <Foundation/Foundation.h> 

@interface ThreadTest: NSObject 

-(void) run; 

-(void) goThread; 

@end 


@implementation ThreadTest 

-(void) run { 

    @autoreleasepool { 
     int i; 
     for (i = 1; i < 5; i++) { 
      NSLog (@"Bar"); 
     } 

     NSLog (@"end of loop"); 
    } 
} 

-(void) goThread { 
    [NSThread detachNewThreadSelector: @selector(run) 
          toTarget: self 
          withObject: nil]; 
} 


int main(void) { 
    @autoreleasepool { 
     ThreadTest *t = [[ThreadTest alloc] init]; 
     [t goThread]; 
    } 

    return 0; 
} 

답변

0

NIL을 삽입하려고하면 NSDictionary에서 충돌이 발생합니다. 그러나 NSNULL 인수를 삽입 할 수 있습니다.

개체가 nil인지 확인하기 위해 대신 NSNULL을 삽입하십시오.

controlObject != nil ? controlObject : [NSNull null]; 
+0

이해가 가지 않습니다. 설명해 주시겠습니까? – Sam

+0

오류 로그를 보면서 질문을 오해했습니다. 이 예외는 스레드로부터 안전하지 않기 때문에 발생합니다. 여러 스레드가 동시에 항목에 액세스하려고 시도했을 수 있습니다. 여기에 대해 여러 가지 유사한 질문이 있습니다. 이에 대한 좋은 대답을 검색해야합니다. 예를 들어 이것 좀 봐 : http://stackoverflow.com/questions/12091212/understanding-nsrunloop –

+0

거북이와 토끼 경주 프로그램과 같은 경주 게임을 만들어 객관적인 -c로 스레드를 이해하고 싶습니다. Java에서 쓰레드처럼 사용하기 쉽습니다. 나는 이것에 대해 더 알 필요가 있다고 생각한다. 고맙습니다. – Sam