2012-08-10 10 views
7

Mögliche Duplizieren:
performSelector may cause a leak because its selector is unknownperform ARC Warnung

Ich habe diesen Code in nicht-ARC, die ohne Fehler oder Warnungen funktioniert:

- (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 
    } 
} 

jedoch, nachdem ich konvertieren zu Projekt in ARC, bekomme ich diese Warnung:

"Perform Selector kann ein Leck verursachen, weil der Selektor unbekannt ist."

Ich hätte gerne Ideen, wie man meinen Code entsprechend zu überarbeiten ..

Antwort

40

Der einzige Weg, die ich gefunden habe, die Warnung zu vermeiden, ist es zu unterdrücken. Sie könnten es in Ihren Build-Einstellungen deaktivieren, aber ich bevorzuge es einfach mit Pragmas zu deaktivieren, wo ich weiß, dass es falsch ist.

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

Wenn Sie den Fehler an mehreren Stellen sind immer, können Sie ein Makro definieren, um es einfacher zu machen, die Warnung zu unterdrücken:

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

Sie das Makro wie folgt verwenden können:

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

Dank Rob. Weißt du, ob da ein Radar ist? David –

+0

Könnte relevant sein: http://stackoverflow.com/questions/11875900/crash-in-objc-retainin-in-method-performed-with-performselector – Jessedc

+0

@DavidDelMonte Ich habe kein Radar dafür vorgelegt. Ich weiß nicht, welche Radargeräte jemand anders gesendet haben könnte. –