我的一个类中有一个实例,我忽略了正确保留传入的参数。追踪起来相当耗时。
在解决这个问题时,我想为这种情况创建一个测试,但我不确定如何继续。这似乎不像创建对象和测试每个成员那么容易,因为这可以通过测试,这取决于自动发布池是否决定立即释放对象。
我的问题是:有没有一种方法可以创建对象,并确保在我进行测试之前发生任何自动释放?我是否应该在测试用例中创建自己的池,并在进行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。