单元测试以验证对象是否被解除分配

3
我需要的是一种编程验证目标对象是否已被释放的方法。目前,我在我想要观察的对象的dealloc方法中使用了NSLog语句。 单元测试框架来自于Google Toolbox for the mac,并且工作得很好。我只是不确定如何构建这个特定的测试。
7个回答

2

谢谢,_GTMDevLog 正是我所寻找的,现在需要弄清如何在我的单元测试目标中设置它。 - Ryan Townshend
如果这正是你所寻找的,并且它帮助你解决了问题,那么你应该接受这个答案 ;) - Jason Coco
所以这就是勾选框的作用。我会在看到它起作用后执行它。 我仍然没有成功地使用这个提示,工作已经把我带向了另一个方向。 - Ryan Townshend

2
您可以使用方法交换(MethodSwizzling)来修改 dealloc 方法。请参考CocoaDev 上的 MethodSwizzling;该页面底部有一个使用 Leopard 新的 method_exchangeImplementations 函数的现代方法。
您的实现需要告诉测试用例对象已被调用。一种方法是在定义测试用例类和替换 dealloc 方法的文件中使用静态变量;您的测试方法将该变量设置为 NO,然后释放对象,并断言该变量的值现在为 true。

1
我在C#/.Net中做了类似的事情。我使用了“WeakReference”来跟踪该项,并测试它是否不再存在(请参见链接)。您能否将这种方法翻译到您的环境中? 链接

1
过去,我创建了一个变量,通过在构造函数中增加值并在析构函数中减少值来计算已分配给给定类的对象数量。单元测试只需检查变量在测试结束时是否为零。

0
你能否在某种事件监视服务中记录dealloc,以便测试代码可以查询是否已发生dealloc。显然,您将按名称或ID记录它,因为对象正在被dealloc...

0

我可能有点天真,但是一个释放内存的单元测试不应该包括以下步骤吗:

  • 分配一个对象
  • 通过要测试的方法释放它
  • 尝试从对象中调用某些内容
  • 捕获异常并检查其类型是否正确

没有异常可捕获 - 尝试解引用已经被 "释放" 的内存指针将导致崩溃。 - Colin Barrett

0

我已经编写了一个函数,它会释放对象并在对象被释放后返回YES

BOOL getsDeallocatedByReleasing(id object);

还有一个高级界面,您可以在其中运行任意代码块,并获得一个布尔值,指示是否已释放给定类的对象:

BOOL classGetsDeallocated(Class c, void (^block)(void));

这段代码使用了方法交换技术,虽然有些丑陋并且肯定不是线程安全的,但它能够正常工作。你可以在GitHub上找到它,如果我发现任何错误,我会及时更新。


附言:在编写所有代码(噢!)之后,是否有可能在开头添加一个单独的retain,执行您想要的操作,拆除您正在检查的对象图并检查对象的保留计数?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接