При запуске 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, поэтому я пытаюсь разобраться в вышесказанном. Фактическая производительность анализатора следующая:
Способ, которым я читаю 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);
Статический анализатор дает это чистую счет здоровья.
Я неправильно читаю что-то из-за того, что объекты являются бесплатными, или это ошибка в статическом анализаторе?