2012-02-26 3 views
2

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

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

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

ответ

2

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

Это поможет вам 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 

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

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

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

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 не удерживаются инкубатором.

+1

Вы не должны использовать [self.array release], было бы лучше иметь массив в качестве локальной переменной в методе тестирования и освободить его. – jrturton

+0

Хороший звонок @jrturton; исправил мой ответ. – yuji