未保留ivar的单元测试



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

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

我的问题是:有没有一种方法可以创建对象,并确保在我进行测试之前发生任何自动释放?我是否应该在测试用例中创建自己的池,并在进行ivar测试之前发布?这种情况会100%发生吗?我是否应该将所有测试封装在自动发布池中,以主动捕捉任何潜在的崩溃?

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

这将立即为您获得EXC_BAD_ACCESS,当且仅当array未被setter保留时,因为其保留计数在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

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

相关内容

  • 没有找到相关文章

最新更新