51

メソッドの場合:

[NSThread detachNewThreadSelector:@selector(method:) toTarget:self withObject:(id)SELECTOR];

@selectorを渡すにはどうすればよいですか?コンパイルするために(id)にキャストしようとしましたが、実行時にクラッシュします。


より具体的には、私はこのような方法を持っています:

+(void)method1:(SEL)selector{
[NSThread detachNewThreadSelector:@selector(method2:) toTarget:self withObject:selector];   
}

クラッシュします。スレッドの準備ができたときに新しいスレッドがセレクターを呼び出すことができるように、クラッシュせずにセレクターを渡すにはどうすればよいですか?

4

5 に答える 5

68

ここでの問題は、セレクターをメソッド自体に渡すことではなく、オブジェクトが期待される場所にセレクターを渡すことです。非オブジェクト値をオブジェクトとして渡すには、を使用できますNSValue。この場合、NSValueを受け入れ、適切なセレクターを取得するメソッドを作成する必要があります。実装例は次のとおりです。

@implementation Thing
- (void)method:(SEL)selector {
    // Do something
}

- (void)methodWithSelectorValue:(NSValue *)value {
    SEL selector;

    // Guard against buffer overflow
    if (strcmp([value objCType], @encode(SEL)) == 0) {
        [value getValue:&selector];
        [self method:selector];
    }
}

- (void)otherMethodShownInYourExample {
    SEL selector = @selector(something);
    NSValue *selectorAsValue = [NSValue valueWithBytes:&selector objCType:@encode(SEL)];
    [NSThread detachNewThreadSelector:@selector(methodWithSelectorValue:) toTarget:self withObject:selectorAsValue];
}
@end
于 2009-05-31T21:13:55.413 に答える
43

NSStringFromSelector()and関数を使用して、セレクターと文字列オブジェクトの間で変換できNSSelectorFromString()ます。したがって、代わりに文字列オブジェクトを渡すことができます。

または、メソッドを変更したくない場合は、NSInvocationを作成してメソッド呼び出しの呼び出しを作成し(オブジェクト以外の引数を使用して呼び出しを設定できるため)、それを呼び出すことができます。[NSThread detachNewThreadSelector:@selector(invoke) toTarget:myInvocation withObject:nil];

于 2011-04-23T01:58:07.297 に答える
4

次のようにNSValueを使用します。

+(void)method1:(SEL)selector {
    NSValue *selectorValue = [NSValue value:&selector withObjCType:@encode(SEL)];
    [NSThread detachNewThreadSelector:@selector(method2:) 
                             toTarget:self 
                           withObject:selectorValue];
}

NSValueは、任意の非オブジェクトタイプのオブジェクトラッパーとして使用されます。

于 2009-05-31T21:14:48.097 に答える
2

参照してください:引数としてメソッドを渡す

于 2009-05-31T20:54:21.553 に答える
0

オブジェクトを指定したくない場合は、nilを使用してください。

[NSThread detachNewThreadSelector:@selector(method:) toTarget:self withObject:nil];

オブジェクトをセレクターに渡す必要がある場合は、次のようになります。

ここでは、メソッド「setText」に文字列を渡します。

NSString *string = @"hello world!";
 [NSThread detachNewThreadSelector:@selector(setText:) toTarget:self withObject:string];


-(void)setText:(NSString *)string {
    [UITextField setText:string]; 
}
于 2009-05-31T20:55:22.613 に答える