我想为dealloc
方法编写iOS单元测试,该方法(基本上)将对象删除为另一个对象的委托。
- (void) dealloc {
someObject.delegate = nil;
}
但是,在使用ARC时,我无法直接呼叫dealloc
。编写单元测试的最佳方法是什么?
答案 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)
}
不要忘记,如果您的测试不会抛出,您不需要 throws
或 try
之前的 autoreleasepool
:)