ios - 未保留 ivars 的单元测试

标签 ios unit-testing nsautoreleasepool

我的一个类中有一个实例,我忽略了正确保留传入的参数。追踪起来相当耗时。

在解决这个问题时,我想为这种情况创建一个测试,但我不确定如何继续。这似乎不像创建对象并测试每个成员那么容易,因为这可以通过测试,具体取决于自动释放池是否决定立即释放该对象。

我的问题是:有没有办法可以创建对象并确保在进行测试之前发生任何自动释放?我应该在测试用例中创建自己的池并在执行 ivar 测试之前发布吗?这样就能 100% 捕获这个案例吗?我应该将所有测试包装在自动释放池中以主动捕获任何潜在的崩溃吗?

最佳答案

如果您使用的构造函数为您提供了一个非自动释放的对象,那么您不必担心这一点。但除此之外,您确实需要使用自动释放池。

当且仅当 array 不被 setter 保留时,这将立即为您提供 EXC_BAD_ACCESS,因为它的保留计数在 release 上变为 0,并且它会立即释放:

NSArray *anArray = [[NSArray alloc] init];
self.array = anArray;
[anArray release];
NSLog(@"Here's my array: %@", self.array); // EXC_BAD_ACCESS if array not retained

尽管一旦自动释放池耗尽,self.array 稍后会变成垃圾,但这不会导致任何错误:

self.array = [NSArray array];
NSLog(@"Here's my array: %@", self.array); // No error for now

如果您必须使用便捷构造函数,只需将赋值包装在自动释放池中即可:

NSAutoreleasePool *testPool = [[NSAutoreleasePool alloc] init];
self.array = [NSArray array];
[testPool drain];
NSLog(@"Here's my array: %@", self.array); // EXC_BAD_ACCESS if array not retained

这样,只要 setter 不保留 array,您就会再次获得 EXC_BAD_ACCESS。

关于ios - 未保留 ivars 的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9451136/

相关文章:

ios - 在 posix 线程上创建自动释放池

ios - 向 TextView 添加约束在 Swift 中不起作用

java - 如何在 Netbeans 8.0 中运行单元测试而不下载 Maven 依赖项?

cocoa-touch - 什么时候自动释放实际上会导致 Cocoa Touch 中的释放?

javascript - Angular 测试文档中 "errorMessage()"功能的内容。 (见说明)

mysql - 在 LiipFunctionalTest 包中使用 YEAR、MONTH、DAY mysql 函数时出错

iphone - 自动引用计数 (ARC) 中的 NSThreads

ios - 我该如何修复或解决此 tableView textField 自动布局故障?

iphone - 添加编译后ITK奇怪的错误

iphone - po 对象导致错误 : cannot find interface declaration for '$__lldb_objc_class'