Хороший вопрос, на первый взгляд это не имеет особого смысла. Конечно, поведение должным образом задокументировано , но было бы неплохо, если бы оно изящно обрабатывало NULL
. Обратите внимание, что CFRetain
и CFMakeCollectable
(новый в 10.4, GC включен в 10.5) демонстрируют одинаковое поведение. Я не знаком со всеми мотивами такого дизайна, но, вероятно, основной упор был сделан на внутреннюю согласованность с остальной частью платформы CoreFoundation.
Трудно / невозможно узнать , почему CF был спроектирован таким образом, если вы не спросите одного из дизайнеров. Я думаю, что дизайнеры решили, что передача NULL для функций управления памятью является (должна быть?) Ошибкой программирования. Можно утверждать, что вызывать сбой в NULL - это желаемое поведение «быстрого сбоя», поскольку ошибки, которые вылетают почти сразу, легче отследить, чем ошибки, которые молча ничего не делают вместо того, что вы ожидаете. Лично я предпочитаю подход "ничего не делать на нуле", но я думаю, что это жизнь ...
Учитывая, что API не может / не будет меняться, вы можете либо проверить NULL, либо обойти проблему. Одним из вариантов может быть определение встроенной функции или макроса, который вызывает CFRelease только для ненулевых ссылок. В любом случае, вероятно, лучше всего быть явным в своем коде, чтобы избежать путаницы в будущем.