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