Почему статический анализатор показывает, что этот соединенный NSNumber протекает при ARC? - PullRequest
4 голосов
/ 31 октября 2011

При запуске Clang Static Analyzer для кода, который я преобразовал для использования ARC, он сообщает номер NSNumber в этом блоке кода как утечку:

NSNumber *temporaryNumber = [NSNumber numberWithFloat:0.85];
CFNumberRef compressionQuality = CFBridgingRetain(temporaryNumber);

CFDictionarySetValue(snapshotMetaAndOpts, kCGImageDestinationLossyCompressionQuality, compressionQuality);
CFRelease(compressionQuality);

Анализатор показывает, что NSNumber, созданный и сохраненный во временном номере, заканчивается после этого счетом сохранения +1, что приводит к утечкам. Я знаю, что я мог бы так же легко сделать

CFDictionarySetValue(snapshotMetaAndOpts, kCGImageDestinationLossyCompressionQuality, (__bridge CFNumberRef)[NSNumber numberWithFloat:0.85]);

но я все еще пытаюсь понять точные действия мостов в ARC, поэтому я пытаюсь разобраться в вышесказанном. Фактическая производительность анализатора следующая:

Visual depiction of static analyzer results

Способ, которым я читаю CFBridgingRetain() и __bridge_retained, заключается в том, что они передают владение управляемым ARC NSObject в Core Foundation, увеличивая количество сохраняемых данных на 1. Я уравновешиваю это с соответствующим CFRelease(). Я ожидаю, что NSNumber будет создан как объект с автоматическим выпуском и, следовательно, будет полностью сбалансирован на стороне ARC.

Точно так же, если я сделаю следующее, используя обычный __bridge cast:

NSNumber *temporaryNumber = [NSNumber numberWithFloat:0.85];
CFNumberRef compressionQuality = (__bridge CFNumberRef)temporaryNumber;
CFDictionarySetValue(snapshotMetaAndOpts, kCGImageDestinationLossyCompressionQuality, compressionQuality);
CFRelease(compressionQuality);

Статический анализатор дает это чистую счет здоровья.

Я неправильно читаю что-то из-за того, что объекты являются бесплатными, или это ошибка в статическом анализаторе?

1 Ответ

5 голосов
/ 31 октября 2011

EDIT: Это ошибка анализатора. На моей машине установлена ​​последняя версия автономного анализатора, и никаких предупреждений нет. Я проверил на соответствие с текущим анализатором доставки и получил те же результаты, что и вы. Похоже, это уже хорошо идти.

Какую версию Xcode вы используете? Я только что проверил следующее.

int main(int argc, char *argv[])
{
    @autoreleasepool 
    {
        CFMutableDictionaryRef dict = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);

        NSNumber *temporaryNumber = [NSNumber numberWithFloat:0.85];
        CFNumberRef compressionQuality = CFBridgingRetain(temporaryNumber);

        CFDictionarySetValue(dict, CFSTR("Test"), compressionQuality);
        CFRelease(compressionQuality);

        CFRelease(dict);
    }
}

Работает как положено и не выдает предупреждений анализатора. Это последняя версия 4.2 на 10.7 с использованием iOS SDK.

...