【问题标题】:"for in" objective c empty array"for in" 目标 c 空数组
【发布时间】:2012-06-26 16:55:05
【问题描述】:

我注意到在目标 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

【问题讨论】:

  • 您的代码与您所说的不符。你说arrayIN 是空的,但你的NSLog 指的是arr,在你的例子中根本没有提到?
  • 糟糕,我试图给出明确的名字 bo 忘记了其中一些......

标签: objective-c nsmutablearray for-in-loop


【解决方案1】:

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

Elegant way to get all objects of a specific type in an Objective-C array

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

【讨论】:

  • 我可能写错了,但它被正确调用并且编译没有问题。我唯一的问题是,即使是使用[NSMutableArray array] 声明并显示计数为 0 的空数组也会被迭代..
  • 我粘贴了实际代码。我认为简化它可能更容易,但它增加了太多问题。所以就在这里!
  • 是的,您正在检查可变数组的长度,但遍历传入的 taskArray。新实例化的可变数组当然是 0 长度,但 taskArray 参数似乎有长度> 在此调试输出中为 0。
【解决方案2】:

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

[tasks addObject:tasks]

而不是

[tasks addObject:task]

在以前的方法中..

谢谢大家!

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

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    相关资源
    最近更新 更多