2012-08-10 16 views
7

Duplicar posibles:
performSelector may cause a leak because its selector is unknownperformSelector ARC advertencia

tengo este código en no-ARC que funciona sin errores o advertencias:

- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents 
{ 
    // Only care about value changed controlEvent 
    _target = target; 
    _action = action; 
} 

- (void)setValue:(float)value 
{ 
    if (value > _maximumValue) 
    { 
     value = _maximumValue; 
    } else if (value < _minimumValue){ 
     value = _minimumValue; 
    } 

    // Check range 
    if (value <= _maximumValue & value >= _minimumValue) 
    { 
     _value = value; 
     // Rotate knob to proper angle 
     rotation = [self calculateAngleForValue:_value]; 
     // Rotate image 
     thumbImageView.transform = CGAffineTransformMakeRotation(rotation); 
    } 
    if (continuous) 
    { 
     [_target performSelector:_action withObject:self]; //warning here 
    } 
} 

Sin embargo, después de que yo convertir para proyectar a ARC, aparece esta advertencia:

"Perform Selector puede causar una fuga porque su selector es desconocido".

Le agradecería ideas sobre cómo revisar mi código en consecuencia ..

Respuesta

40

La única forma que he encontrado para evitar la advertencia es para suprimirla. Podrías desactivarlo en tu configuración de compilación, pero prefiero usar pragmas para deshabilitarlo cuando sé que es espurio.

#  pragma clang diagnostic push 
#  pragma clang diagnostic ignored "-Warc-performSelector-leaks" 
      [_target performSelector:_action withObject:self]; 
#  pragma clang diagnostic pop 

Si usted está recibiendo el error en varios lugares, se puede definir una macro para que sea más fácil para suprimir la advertencia:

#define SuppressPerformSelectorLeakWarning(Stuff) \ 
    do { \ 
     _Pragma("clang diagnostic push") \ 
     _Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \ 
     Stuff; \ 
     _Pragma("clang diagnostic pop") \ 
    } while (0) 

Usted puede utilizar la macro como esta:

SuppressPerformSelectorLeakWarning([_target performSelector:_action withObject:self]); 
+0

Gracias Rob. ¿Sabes si hay un Radar sobre esto? David –

+0

Podría ser relevante: http://stackoverflow.com/questions/11875900/crash-in-objc-retain-in-method-performed-with-performselector – Jessedc

+0

@DavidDelMonte No le he enviado un radar. No sé qué radares podría haber enviado alguien más. –

Cuestiones relacionadas