2

初期化された空のNSMutableArrayでObjectiveCで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 に答える