1295 Stimmen

PerformSelector kann ein Leck verursachen, weil sein Selektor unbekannt ist.

Ich erhalte die folgende Warnung vom ARC-Compiler:

"performSelector kann ein Leck verursachen, weil sein Selektor unbekannt ist".

Das ist, was ich tue:

[_controller performSelector:NSSelectorFromString(@"someMethod")];

Warum erhalte ich diese Warnung? Ich verstehe, dass der Compiler nicht überprüfen kann, ob der Selektor existiert oder nicht, aber warum würde das ein Leck verursachen? Und wie kann ich meinen Code ändern, damit ich diese Warnung nicht mehr erhalte?

2voto

supersabbath Punkte 364

Statt des Blockansatzes zu verwenden, der mir einige Probleme bereitet hat:

    IMP imp = [_controller methodForSelector:selector];
    void (*func)(id, SEL) = (void *)imp;

Ich werde NSInvocation verwenden, so wie hier:

    -(void) sendSelectorToDelegate:(SEL) selector withSender:(UIButton *)button 

    if ([delegate respondsToSelector:selector])
    {
    NSMethodSignature * methodSignature = [[delegate class]
                                    instanceMethodSignatureForSelector:selector];
    NSInvocation * delegateInvocation = [NSInvocation
                                   invocationWithMethodSignature:methodSignature];

    [delegateInvocation setSelector:selector];
    [delegateInvocation setTarget:delegate];

    // remember the first two parameter are cmd and self
    [delegateInvocation setArgument:&button atIndex:2];
    [delegateInvocation invoke];
    }

2voto

arsenius Punkte 10570

Wenn Sie keine Argumente übergeben müssen, ist ein einfacher Workaround die Verwendung von valueForKeyPath. Dies ist sogar bei einem Class-Objekt möglich.

NSString *colorName = @"brightPinkColor";
id uicolor = [UIColor class];
if ([uicolor respondsToSelector:NSSelectorFromString(colorName)]){
    UIColor *brightPink = [uicolor valueForKeyPath:colorName];
    ...
}

-1voto

Damon Punkte 269

Sie könnten auch ein Protokoll hier verwenden. Erstellen Sie also ein Protokoll wie folgt:

@protocol MyProtocol
-(void)doSomethingWithObject:(id)object;
@end

In Ihrer Klasse, die Ihren Selektor aufrufen muss, haben Sie dann eine @property.

@interface MyObject
    @property (strong) id source;
@end

Wenn Sie @selector(doSomethingWithObject:) in einer Instanz von MyObject aufrufen müssen, tun Sie dies:

[self.source doSomethingWithObject:object];

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X