2012-08-10 11 views
7

Powiel możliwe:
performSelector may cause a leak because its selector is unknownperformSelector ARC ostrzeżenie

Mam ten kod w niewyspecjalizowanych ARC, który działa bez błędów lub ostrzeżeń:

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

Jednak po I przekonwertować na projekt na ARC, otrzymuję to ostrzeżenie:

"Wykonanie selektora może spowodować wyciek, ponieważ jego selektor jest nieznany."

chciałbym docenić pomysły na zmiany Odpowiednio mój kod ..

Odpowiedz

40

Jedynym sposobem znalazłem uniknąć ostrzeżenie jest go stłumić. Możesz go wyłączyć w ustawieniach kompilacji, ale wolę po prostu użyć pragmy, aby wyłączyć go, gdy wiem, że jest fałszywy.

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

Jeśli otrzymujesz błąd w kilku miejscach, można zdefiniować makro, aby ułatwić tłumić ostrzeżenie:

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

Można użyć makra tak:

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

Dzięki Rob. Czy wiesz, czy jest na tym radar? David –

+0

Może być istotny: http://stackoverflow.com/questions/11875900/crash-in-objc-retain-in-method-performed-wformatselector – Jessedc

+0

@DavidDelMonte Nie przesłałem do niego radaru. Nie wiem, jakie radary mógł przedstawić ktoś inny. –

Powiązane problemy