Frage

Für das Verfahren:

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

Wie kann ich in einem @selector passieren? Ich habe versucht, es zu (id) Gießen, um es zu kompilieren, aber es stürzt in der Laufzeit.


Genauer gesagt, ich habe eine Methode wie folgt:

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

Es stürzt ab. Wie gehe ich in den Selektor ohne Absturz, so dass der neue Thread können die Wähler aufrufen, wenn der Thread bereit ist?

War es hilfreich?

Lösung

Das Problem hier ist nicht vorbei einen Selektor auf ein Verfahren, per se, sondern eine Auswahl vorbei, wo ein Objekt erwartet wird. Um einen nicht-Objektwert als Objekt übergeben, können Sie NSValue . In diesem Fall müssen Sie ein Verfahren schaffen, die eine NSValue und ruft den entsprechenden Selektor akzeptiert. Hier ist ein Beispiel-Implementierung:

@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

Andere Tipps

Sie können zwischen Selektoren und String-Objekte unter Verwendung der NSStringFromSelector() und NSSelectorFromString() Funktionen konvertieren. So können Sie einfach passieren String-Objekte statt.

Alternativ kann, wenn Sie wollen Ihre Methoden nicht ändern, können Sie eine NSInvocation erstellen einen Aufruf für Ihren Methodenaufruf zu erstellen (da es bis Anrufungen mit nicht-Objekt Argumenten festlegen kann), und dann [NSThread detachNewThreadSelector:@selector(invoke) toTarget:myInvocation withObject:nil]; es zu nennen tun

Verwenden NSValue, etwa so:

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

NSValue soll als Objekt-Wrapper für beliebige Nicht-Objekttypen.

Bitte beachten Sie: ein Verfahren als Argument geben

Wenn Sie ein Objekt angeben wollen einfach nicht gleich Null verwenden.

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

Wenn Sie ein Objekt an den Wähler zu übergeben es in etwa so aussehen würde.

Hier eine Zeichenfolge an die Methode „setText“ Ich bin übergeben.

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


-(void)setText:(NSString *)string {
    [UITextField setText:string]; 
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top