8

重複の可能性:
セレクターが不明であるため、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
    }
}

ただし、プロジェクトを ARC に変換した後、次の警告が表示されます。

「Perform Selector は、そのセレクターが不明であるため、リークを引き起こす可能性があります。」

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

4

1 に答える 1

43

警告を回避する唯一の方法は、警告を抑制することです。ビルド設定で無効にすることもできますが、プラグマを使用して、偽であることがわかっている場合に無効にすることをお勧めします。

#       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]);
于 2012-08-10T04:33:46.597 に答える