2

我注意到在目标 c 中对初始化的空 NSMutableArray 执行 for/in 操作没有按预期工作。

简化代码是:

+(void) convertArray: (NSMutableArray*)arrayIN {

    NSMutableArray *arrayOUT = [NSMutableArray array];

    NSLog(@"is nil %d - count %d", !arrayIN, [arrayIN count]);

    for(NSObject *o in arrayIN)
        [arrayOUT addObject:[o convertToAnotherClass]];

}

实际代码是:

+(BOOL) writeTasks: (NSArray*)tasksArray {

    NSMutableArray *arr = [NSMutableArray array];
    NSLog(@"is nil %d - count %d", !arr, [arr count]);
    for(Task *t in tasksArray)
        [arr addObject:[t getDictionary]];

    NSError *error; 
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:arr options:NSJSONWritingPrettyPrinted error:&error];

    if (! jsonData) {
        NSLog(@"Got an error: %@", error);
        return NO;
    } else {
        //NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
        [jsonData writeToFile:path options:NSDataWritingAtomic error:nil];
        return YES;
    }
}

令人惊讶的是,执行[dummyClass convertArray:[NSMutableArray array]]显示了这一点:

2012-06-25 13:51:34.236 Planorama[740:707] is nil 0 - count 0
2012-06-25 13:51:34.239 Planorama[740:707] -[__NSArrayM convertToAnotherClass]: unrecognized selector sent to instance 0xde9b580
(lldb) 

为什么 ?arrayIN 为空,为什么convertToAnotherClass还要调用?

4

2 回答 2

1

如果您使用基于块的枚举,它将按照您想要的方式工作。此外,输出表明 o 设置为某个实例,因此您可能遇到另一个问题。

在 Objective-C 数组中获取特定类型的所有对象的优雅方法

最后,看起来这是一个静态方法,但您的示例将其称为实例方法。

于 2012-06-25T12:24:46.083 回答
0

正如 Joshua Smith 指出的那样:我没有检查迭代数组的计数。迭代数组不是空的并且包含自身,因为如果输入错误的行:

[tasks addObject:tasks]

代替

[tasks addObject:task]

在以前的方法中..

谢谢大家 !

PS:Joshua Smith 的链接非常有用!未来的读者:看看吧!

于 2012-06-25T12:44:02.093 回答