Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 未修复IVAR的单元测试_Ios_Unit Testing_Nsautoreleasepool - Fatal编程技术网

Ios 未修复IVAR的单元测试

Ios 未修复IVAR的单元测试,ios,unit-testing,nsautoreleasepool,Ios,Unit Testing,Nsautoreleasepool,在我的一个类中有一个实例,我忽略了正确保留传入的参数。追查起来相当耗时 在解决这个问题时,我想为这种情况创建一个测试,但我不确定如何继续。这似乎不像创建对象和测试每个成员那么容易,因为这可以通过测试,这取决于自动释放池是否决定立即释放对象 我的问题是:是否有一种方法可以创建对象并确保在我进行测试之前发生任何自动释放?在执行ivar测试之前,我是否应该在测试用例中创建自己的池并发布?这种情况会100%的发生吗?我是否应该将所有测试包装在自动释放池中,以主动捕获任何潜在的崩溃?如果您使用的构造函数为

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

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


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

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

当且仅当
数组
未被setter保留时,这将立即为您提供EXC\u BAD\u访问,因为它的保留计数在
发布时变为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\u BAD\u访问权。

您不应该使用[self.array release],最好将数组作为测试方法中的局部变量,并将其释放。Good call@jrturton;修正了我的答案。