Модульное тестирование для неиспользованных иваров - PullRequest
2 голосов
/ 26 февраля 2012

У меня был экземпляр в одном из моих классов, где я забыл правильно сохранить переданный параметр. Это было довольно много времени, чтобы выследить.

Исправляя это, я хочу создать тест для этой ситуации, но я не уверен, что делать дальше. Кажется, это не так просто, как создание объекта и тестирование каждого члена, так как это может пройти тест в зависимости от того, решил ли пул авто-релиза сразу отпустить объект или нет.

Мой вопрос: есть ли способ, которым я могу создать объект и гарантировать, что любой авторелиз произойдет до того, как я выполню свои тесты? Должен ли я создать свой собственный пул в тестовом примере и выпустить его до того, как я проведу тестирование на ivar? Будет ли это ловить случай 100% времени? Должен ли я обернуть ВСЕ свои тесты в пул авто-релизов, чтобы заранее перехватить возможные сбои?

1 Ответ

2 голосов
/ 26 февраля 2012

Если вы используете конструктор, который выдает объект, не выпущенный автоматически, вам не нужно беспокоиться об этом.Но в противном случае вам нужно использовать пулы с автоматическим выпуском.

Это немедленно даст вам EXC_BAD_ACCESS, если и только если array не сохранено сеттером, так как его счетчик хранения равен 0 на release и он немедленно освобождается:

NSArray *anArray = [[NSArray alloc] init];
self.array = anArray;
[anArray release];
NSLog(@"Here's my array: %@", self.array); // EXC_BAD_ACCESS if array not retained

Принимая во внимание, что это не вызовет никаких ошибок, даже если self.array станет мусором позже, как только пул автоматического выпуска:

self.array = [NSArray array];
NSLog(@"Here's my array: %@", self.array); // No error for now

Если вам нужно использовать вспомогательный конструктор, просто оберните присвоение в пул авто-релиза:

NSAutoreleasePool *testPool = [[NSAutoreleasePool alloc] init];
self.array = [NSArray array];
[testPool drain];
NSLog(@"Here's my array: %@", self.array); // EXC_BAD_ACCESS if array not retained

Таким образом, вы снова получите EXC_BAD_ACCESS, если array не сохраняется.сеттером.

...