2012-08-10 19 views
7

Olası Çoğalt:
performSelector may cause a leak because its selector is unknownperformSelector ARC uyarı

Hatalı veya uyarılı olmadan çalışır olmayan ARC bu kodu vardır:

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

Ancak, I sonrası projeye ARC dönüştür, bu uyarıyı aldım:

"Seçici bilinmeyen olduğundan, bir seçici sızıntıya neden olabilir." Ben buna göre kodumu revize etmek konusunda fikir takdir ediyorum

..

cevap

40

Ben uyarıyı önlemek için bulduk tek yolu onu bastırmaktır. Yapılandırma ayarlarınızda bunu devre dışı bırakabilirsiniz, ancak sahte olduğunu bildiğim yerde devre dışı bırakmak için pragmaları kullanmayı tercih ederim.

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

Böyle makro kullanabilirsiniz::

Eğer çeşitli yerlerde hata mesajı alıyorsanız,

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

, daha kolay uyarıyı bastırmak için yapmak için bir makro tanımlayabilirsiniz

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

Teşekkürler Rob. Bunun üzerinde bir Radar olup olmadığını biliyor musun? David –

+0

Might alakalı olabilir: http://stackoverflow.com/questions/11875900/crash-in-objc-retain-in-method-performed-with-performselector – Jessedc

+0

@DavidDelMonte Bunun için bir radar vermedim. Başka hangi radarların gönderebileceğini bilmiyorum. –