Модульный тест для проверки освобождения объекта - PullRequest
3 голосов
/ 17 ноября 2008

То, что я ищу, - это способ программно убедиться, что целевой объект был освобожден. В настоящее время у меня есть оператор NSLog в методах dealloc объектов, которые я хочу наблюдать. Инфраструктура модульного тестирования взята из Google Toolbox для Mac, и она прекрасно работает. Я просто не уверен, как создать этот конкретный тест.

Ответы [ 7 ]

2 голосов
/ 18 ноября 2008

Вы можете воспользоваться методом dealloc. См. MethodSwizzling на CocoaDev ; современный подход с использованием новой функции method_exchangeImplementations Leopard (в настоящее время) находится внизу страницы.

Ваша реализация должна будет сообщить объекту тестового примера, что он был вызван. Одним из способов сделать это была бы статическая переменная в файле, где определены и класс тестового случая, и метод замены dealloc; Ваш тестовый метод устанавливает эту переменную на NO, затем освобождает объект, а затем утверждает, что значение переменной теперь истинно.

2 голосов
/ 17 ноября 2008

Использовать _GTMDevLog:

См. Advanced Stuff | Регистрация модульных тестов на этой странице .

Подробнее о DevLogNAssert .

1 голос
/ 17 ноября 2008

В прошлом я создавал переменную, которая подсчитывает количество объектов данного класса, которые были выделены путем увеличения значения в конструкторе и уменьшения его в деструкторе. Модульные тесты просто проверяют, что переменная равна нулю в конце теста.

1 голос
/ 17 ноября 2008

Я сделал нечто очень похожее на это в C # /. Net. Я использовал WeakReference для отслеживания элемента и проверил, что его больше не существует (см. Ссылку). Можете ли вы перевести этот подход в вашу среду?

http://geekswithblogs.net/HouseOfBilz/archive/2008/11/11/writing-tests-to-catch-memory-leaks-in-.net.aspx

0 голосов
/ 11 ноября 2010

Я написал функцию, которая освобождает объект и возвращает YES, если объект был освобожден:

BOOL getsDeallocatedByReleasing(id object);

Также имеется расширенный интерфейс, где вы можете запускать произвольный код в блоке, и вы получите логическое значение, указывающее, был ли освобожден объект данного класса:

BOOL classGetsDeallocated(Class c, void (^block)(void));

В коде используется метод swizzling, он довольно уродливый и определенно не поточно-ориентированный, но работает. Вы можете найти его на GitHub , я буду держать его в курсе, если найду какие-либо ошибки.


P.S. После написания всего этого кода (да!), Не будет ли возможно добавить один retain в начале, делать все, что вы хотите, разбирать граф объекта, который вы проверяете, и проверять счет сохранения объекта? 1014 *

0 голосов
/ 17 ноября 2008

Я могу быть наивным, но не будет ли юнит-тест освобождения состоять из

  • выделение объекта,
  • освобождая его от вашего метода для тестирования,
  • пытается что-то вызвать из объекта, а затем
  • перехватывает исключение и проверяет, верен ли его тип?
0 голосов
/ 17 ноября 2008

Не могли бы вы записать dealloc в какой-то вид службы мониторинга событий, чтобы затем тестовый код мог запросить его, чтобы узнать, произошло ли dealloc. Очевидно, что вы запишете его по имени или идентификатору, так как объект в настоящее время обрабатывается ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...