Как вы могли бы написать unit test -using OCUnit, чтобы гарантировать, что объекты будут выпущены/сохранены должным образом в Cocoa/Objective-C?
Наивный способ сделать это - проверить значение retainCount
, но, конечно, вы никогда не должны использовать retainCount
. Можете ли вы просто проверить, присвоено ли объектной ссылке значение nil
, чтобы указать, что она была выпущена? Кроме того, какие гарантии у вас есть о сроках, когда объекты фактически освобождены?
Я надеюсь на краткое решение только нескольких строк кода, так как я, вероятно, буду использовать это широко. На самом деле могут быть два ответа: один, который использует пул автозапуска, а другой - нет.
Чтобы уточнить, я не ищу способ всесторонне протестировать каждый объект, который я создаю. Невозможно unit test провести какое-либо поведение всесторонне, не говоря уже о управлении памятью. По крайней мере, было бы неплохо проверить поведение выпущенных объектов для регрессионного тестирования (и убедиться, что одна и та же ошибка, связанная с памятью, не происходит дважды).
Об ответах
Я принял BJ Homer ответ, потому что я нашел, что это самый простой и сжатый способ достижения что я имел в виду, учитывая предостережение о том, что слабые указатели, снабженные Automatic Reference Counting, недоступны в производственных версиях XCode (до 4.2?) По состоянию на 23 июля 2011 года. Мне также было приятно узнать, что
ARC может быть включена для каждого файла; это не требует, чтобы ваш весь проект использует его. Вы можете скомпилировать ваши модульные тесты с помощью ARC и оставьте свой основной проект на ручном удержании, и этот тест будет все еще работают.
При этом для более детального изучения потенциальных проблем, связанных с управлением памятью модулей тестирования в Objective-C, я настоятельно рекомендую Peter Hosey подробный отклик.