Модульный тест для разлочки с ARC в iOS - PullRequest
6 голосов
/ 03 декабря 2011

Я бы хотел написать модульный тест iOS для метода dealloc, который (в основном) удаляет объект как делегат другого объекта.

- (void) dealloc {
    someObject.delegate = nil;
}

Однако я не могу позвонить dealloc напрямую при использовании ARC. Как лучше написать этот модульный тест?

Ответы [ 3 ]

6 голосов
/ 03 декабря 2011

Присвойте экземпляр слабой переменной:

MyType* __weak zzz = [[MyType alloc] init];

Экземпляр будет немедленно освобожден.

В качестве альтернативы, вы можете отключить ARC в файле модульного теста и позвоните в dealloc.

5 голосов
/ 12 октября 2014

Лучшее решение - просто

- (void)testDealloc
{
    __weak CLASS *weakReference;
    @autoreleasepool {
        CLASS *reference = [[CLASS alloc] init]; // or similar instance creator.
        weakReference = reference;

        // Test your magic here.
        [...]
    }
    // At this point the everything is working fine, the weak reference must be nil.
    XCTAssertNil(weakReference);
}

Это работает, создавая экземпляр класса, который мы хотим освободить внутри @autorealase, который будет освобожден (если мы не просочились), как только мы выйдем из блока. weakReference будет содержать ссылку на экземпляр без его сохранения, для которого будет установлено значение nil.

3 голосов
/ 01 октября 2014

На самом деле вы можете использовать пользовательский пул автоматического выпуска для проверки поведения, связанного с деллоком:

- (void) testDealloc {
    id referencedObject = ...
    @autoreleasepool {
         id referencingObject = [ReferencingObject with:referencedObject];
         ...
    }
    // dealloc has been called on referencingObject here, unless you have a memory leak
    XCTAssertNil(referencedObject.delegate);
}
...