Objective c &引用;在「;目标c空数组
我注意到,在初始化的空NSMutableArray上执行目标c中的for/in操作并没有按预期工作 简化代码为:Objective c &引用;在「;目标c空数组,objective-c,nsmutablearray,for-in-loop,Objective C,Nsmutablearray,For In Loop,我注意到,在初始化的空NSMutableArray上执行目标c中的for/in操作并没有按预期工作 简化代码为: +(void) convertArray: (NSMutableArray*)arrayIN { NSMutableArray *arrayOUT = [NSMutableArray array]; NSLog(@"is nil %d - count %d", !arrayIN, [arrayIN count]); for(NSObject *o 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;
}
}
实际代码为:
+(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]]
显示了以下内容:
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
?如果使用基于块的枚举,它将按照您想要的方式工作。
此外,输出表明o被设置为某个对象的某个实例,因此您可能还有另一个问题
最后,看起来这是一个静态方法,但您的示例将其称为实例方法。正如Joshua Smith指出的那样:我没有检查迭代数组的计数。迭代的数组不是空的,并且包含自身,因为如果键入错误的行:
[tasks addObject:tasks]
而不是
[tasks addObject:task]
在前面的方法中
谢谢大家
注:约书亚·史密斯的链接非常有用!未来读者:看看吧 你的代码与你说的不匹配。你说
arrayIN
是空的,但是你的NSLog
引用了arr
,这在你的例子中根本没有提到?哎呀,我试着给了明确的名字,但是忘记了其中的一些…我可能写错了,但是调用正确,编译没有问题。我唯一的问题是,即使是使用[NSMutableArray]
声明并显示计数为0的空数组也会被迭代。我粘贴了实际的代码。我认为简化它可能更容易,但它增加了太多的问题。就是这样!是的,您正在检查可变数组的长度,但在传入的taskArray上进行迭代。当然,新实例化的可变数组的长度为0,但在此调试输出中,taskArray参数的长度似乎大于0。