在iOS中使用ARC进行dealloc的单元测试

时间:2011-12-03 18:00:34

标签: ios objective-c unit-testing automatic-ref-counting

我想为dealloc方法编写iOS单元测试,该方法(基本上)将对象删除为另一个对象的委托。

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

但是,在使用ARC时,我无法直接呼叫dealloc。编写单元测试的最佳方法是什么?

4 个答案:

答案 0 :(得分:6)

将实例分配给弱变量:

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

该实例将立即解除分配。

或者,you can disable ARC on your unit test file并调用dealloc。

答案 1 :(得分:5)

更好的解决方案就是

- (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

答案 2 :(得分:3)

您实际上可以使用自定义自动释放池来测试与dealloc相关的行为:

- (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);
}

答案 3 :(得分:0)

在 Swfit 5.3 中:

func test_myObject_dealloc() throws {
    weak var weakObject: MyObject?
    try autoreleasepool {
        let strongObject: MyObject = initializeMyObject(…)
        weakObject = strongObject
        XCTAssertNotNil(weakObject)
        // Perform your tests here…
    }
    XCTAssertNil(weakObject) 
}

不要忘记,如果您的测试不会抛出,您不需要 throwstry 之前的 autoreleasepool :)