2017-01-16 12 views
0

Я хочу построить объект, который может запускать цикл в потоке. Когда я запускаю цикл в потоке с помощью NSThread, иногда работает нормально, и иногда появляются сообщения об ошибке:Objective-c Loop в 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

NSDictionary падает, если вы попытаетесь вставить NIL в него. Однако вы можете вставить в него NSNULL-аргумент.

Так что просто сделайте чек, если ваш объект равен нулю, вместо этого вставьте NSNULL.

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

Я не понимаю, не могли бы вы объяснить это? – Sam

+0

Я неправильно понял ваш вопрос, глядя на ваш журнал ошибок. Исключение, вероятно, происходит, поскольку это не является потокобезопасным, несколько потоков могут пытаться получить доступ к элементу одновременно. Здесь есть несколько похожих вопросов, которые вы должны искать с хорошими ответами. посмотрите на это, например: http://stackoverflow.com/questions/12091212/understanding-nsrunloop –

+0

Я хочу понять поток в объективе-c, создав гоночную игру, такую ​​как черепаха и программа для кроликов. Это не просто как поток в java, который прост в использовании. Думаю, мне нужно больше узнать об этом. Большое спасибо. – Sam