Iphone 目标-c';双自由';ARC模式中的错误
我试着练习block和GCD/NSD操作,所以我写了这个项目,但是当我试着用单元测试来测试它时,我总是遇到“双自由”错误,我认为在ARC模式下不应该有这样的错误 这是密码Iphone 目标-c';双自由';ARC模式中的错误,iphone,ios,objective-c,objective-c-blocks,Iphone,Ios,Objective C,Objective C Blocks,我试着练习block和GCD/NSD操作,所以我写了这个项目,但是当我试着用单元测试来测试它时,我总是遇到“双自由”错误,我认为在ARC模式下不应该有这样的错误 这是密码 - (void)each:(NSArray *)items iterator:(callbackEach)iterator complete:(callbackWithError)complete { NSBlockOperation *blockOp = [NSBlockOperation blockOperatio
- (void)each:(NSArray *)items iterator:(callbackEach)iterator complete:(callbackWithError)complete {
NSBlockOperation *blockOp = [NSBlockOperation blockOperationWithBlock:^{
if (!items || items.count == 0) {
complete(nil);
return;
}
callbackWithError __block completeOnce = complete;
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSLog(@"start operations %@", queue);
[queue setMaxConcurrentOperationCount:kMaxConcurrentOperationCount];
NSInteger __block count = 0;
for (id item in items) {
NSOperation *op = [NSBlockOperation blockOperationWithBlock:^{
iterator(item, ^(NSError *error) {
if (error) {
completeOnce(error);
completeOnce = nil;
} else {
count++;
if (count >= items.count) {
completeOnce(nil);
completeOnce = nil;
}
}
});
}];
[queue addOperation:op];
}
[queue waitUntilAllOperationsAreFinished];
NSLog(@"all operations are down %@", queue);
}];
[_mainQueue addOperation:blockOp];
}
这是测试代码:
- (void)testEachWithBigData {
BOOL __block completed = false;
NSMutableArray *items = [NSMutableArray arrayWithCapacity:100];
for (int i = 1; i < 10000; ++i) {
[items addObject:[NSString stringWithFormat:@"%d", i]];
}
NSMutableArray *result = [NSMutableArray arrayWithCapacity:100];
[_async each:items
iterator:^(id item, callbackWithError callback) {
//NSLog(@"======item %@", item);
NSNumber *num = [NSNumber numberWithInt:[item integerValue]];
//NSLog(@"number %@", num);
[result addObject:num];
callback(nil);
}
complete:^(NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
STAssertNil(error, @"there should be no error");
[result sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
NSNumber *num1 = (NSNumber *)obj1;
NSNumber *num2 = (NSNumber *)obj2;
if ([num1 integerValue] > [num2 integerValue]) {
return NSOrderedDescending;
} else if ([num1 integerValue] < [num2 integerValue]) {
return NSOrderedAscending;
}
return NSOrderedSame;
}];
NSInteger index = 1;
for (NSNumber *num in result) {
STAssertEquals(index, [num integerValue], @"the value should be ordered");
index++;
}
completed = YES;
});
}
];
NSDate *until = [NSDate dateWithTimeIntervalSinceNow:10];
while (!completed && [until timeIntervalSinceNow] > 0) {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
beforeDate:until];
}
}
-(无效)使用大数据测试{
BOOL u_blockcompleted=false;
NSMutableArray*items=[NSMutableArray阵列容量:100];
对于(int i=1;i<10000;++i){
[项目添加对象:[NSString stringWithFormat:@“%d”,i]];
}
NSMutableArray*结果=[NSMutableArray阵列容量:100];
[\u async each:items
迭代器:^(id项,callbackWithError回调){
//NSLog(@“=======item%@”,item);
NSNumber*num=[NSNumber numberWithInt:[项目整数值]];
//NSLog(@“number%@”,num);
[结果addObject:num];
回调(零);
}
完成:^(N错误*错误){
dispatch\u async(dispatch\u get\u main\u queue()^{
STAssertNil(错误,@“应该没有错误”);
[结果排序器:^n比较结果(id obj1,id obj2){
NSNumber*num1=(NSNumber*)obj1;
NSNumber*num2=(NSNumber*)obj2;
if([num1 integerValue]>[num2 integerValue]){
退而求其次;
}如果([num1整数值]<[num2整数值]){
回报率下降;
}
返回指定名称;
}];
NSInteger指数=1;
for(结果中的NSNumber*num){
STAssertEquals(索引,[num integerValue],@“值应按顺序排列”);
索引++;
}
完成=是;
});
}
];
NSDate*INTIL=[NSDate DATE WITH TIME INTERVALICENSNOW:10];
而(!已完成&&[直到TimeIntervalenceNow]>0){
[[NSRunLoop currentRunLoop]运行模式:NSDefaultRunLoopMode
日期之前:直到];
}
}
如果无法再现错误,请将测试项计数增加到10000
for (int i = 1; i < 10000; ++i) {
[items addObject:[NSString stringWithFormat:@"%d", i]];
}
for(int i=1;i<10000;++i){
[项目添加对象:[NSString stringWithFormat:@“%d”,i]];
}
并对NSLog()进行注释
然后命令+U运行单元测试
以下是错误消息:
otest(11105,0xb039f000)malloc:*对象0xa0f8000的错误:未分配要释放的指针
otest(11209,0xb0115000)malloc:*对象0x41dcc00的错误:未分配要释放的指针
*在malloc\u error\u break中设置断点以进行调试
这次我无法重现“双自由”错误我无法重新生成任何东西,即使是100000个项目。你能澄清一下“双自由”错误的含义吗。我也没有得到错误。确切的错误消息是什么?运行单元测试多次,然后我就可以得到错误