2012-08-10 14 views
7

可能性の重複:私の後に、しかしperformSelector ARC警告

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


performSelector may cause a leak because its selector is unknown

私はエラーや警告なしで動作非ARCでこのコードを持っていますARCにプロジェクトに変換すると、私はこの警告を受け取ります:

"セレクタを実行するとセレクタが不明なためリークが発生することがあります。"

私はそれに応じて自分のコードを修正する方法についてのアイデアをいただければ幸いです。..

答えて

40

私は警告を回避するために見つけた唯一の方法は、それを抑制することです。あなたのビルド設定で無効にすることができますが、私はそれが偽であることを知っているところでプラグマを無効にすることを好むだけです。

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

あなたはいくつかの場所でエラーを取得している場合、あなたはそれが簡単に警告を抑制するために作成するマクロを定義することができます。

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

あなたはこのようなマクロを使用することができます:

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

ありがとうございます。これにレーダーがあるかどうか知っていますか?デビッド –

+0

関連性があります:http://stackoverflow.com/questions/11875900/crash-in-objc-retain-in-method-performed-with-performselector – Jessedc

+0

@DavidDelMonte私はそれのためのレーダーを提出していません。私は他のレーダーが何を提出しているのか分かりません。 –