Вы можете просто вызвать метод непосредственно:
it(@"Should cleanup when receiving a memory warning", ^{
[controller didReceiveMemoryWarning];
// assert here that the data that you expected was released
});
При таком подходе вы должны будете пройти через свойство контроллера, который вы ожидаете, чтобы быть в неожиданностях на предупреждении памяти nil-ed
.
Или вы можете проверить использование памяти в тестовом приложении и посмотреть, уменьшилась ли память после предупреждения о моделируемой памяти. Это не так точно, как первый подход, но он может дать вам несколько советов. И вы также должны убедиться, что контроллер будет оказано на экране, или по крайней мере сделать его думать, что это оказанной и начать строить мнения/вид ячеек таблицы и т.д.
it(@"Should cleanup when receiving a memory warning", ^{
vm_size_t memoryBeforeMemWarning;
vm_size_t memoryAfterMemWarning;
MyController *controller = nil;
@autoreleasepool {
controller = ...;
// call controller.view, or other methods that create the view
// also call any other methods that trigger subview creation
memoryBeforeMemWarning = getMemUsage();
//simulate the memory warning
[controller didReceiveMemoryWarning];
}
memoryAfterMemWarning = getMemUsage();
// reference the variable here to make sure ARC doesn't
// release it when it detects its last reference
controller = nil;
// now assert upon the difference between the two reported memory usages
});
Вы должны использовать autorelease pool
иметь контроль над объектами, созданными с помощью autorelease
, поскольку эти объекты будут освобождены при завершении области autorelease pool
, а не при истощении основного autorelease pool
.
Примечание. Я не добавил реализацию getMemUsage()
, вы можете узнать, как ее реализовать. here.