необработанное исключение 'NSInvalidArgumentException' -> Цель C - PullRequest
1 голос
/ 23 мая 2011

Я пробовал примерную программу потока от Google, и я получаю исключение времени выполнения.

Есть ли какой-либо веб-сайт, который дает пример того, как использовать циклы выполнения вместе с потоками.Мне нужно установить два события и создать поток и параллельно выполнить другую функцию.

// 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:])'

Ответы [ 2 ]

2 голосов
/ 23 мая 2011

Первая часть: у вас была опечатка

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

Вторая часть: ваша основная функция возвращается и вынуждает программу завершиться, прежде чем вы дадите потоку шанс что-либо сделать. В этом простом простом примере вы можете просто

sleep(2);

сразу после звонка на detachNewThreadSelector:

В более сложных случаях вам может потребоваться позвонить по номеру CFRunLoopRun(); в главном потоке или выполнить другое действие, чтобы сохранить второй поток живым.

1 голос
/ 23 мая 2011

Вы сделали опечатку.Метод в Runner определяется как rumMe, но в основной программе вы используете runMe.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...