0

別の辞書に保存している辞書があり、それ自体が次のように配列に保存されます。

NSMutableDictionary* sectionHeights = [[NSMutableDictionary alloc]initWithObjectsAndKeys:
                [NSString stringWithFormat:@"%f", section1Height], @"Section 1 Height",
                [NSString stringWithFormat:@"%f", section2Height], @"Section 2 Height",
        nil];

        [sectionObjects addObject:
         [[NSMutableDictionary alloc] initWithObjectsAndKeys:
          @"Site Inspection Report", @"Form Name",
          @"2", @"Section Count",
          sectionHeights, @"Section Heights",
          nil]
         ];

配列を別のクラスのプロパティ値に渡します。このようにsectionHeightsを読み戻そうとすると、アプリがクラッシュします。

//get the subSectionData
    NSDictionary* subSectionData = [sectionObjects objectAtIndex:sectionObjects.count-1];
    NSDictionary* sectionHeights = [subSectionData objectForKey:@"Section Heights"];
    for(id obj in sectionHeights) {
        NSLog(@"%@", obj);
    }

この場合、sectionHeightsには2つのオブジェクトがあります。NSStringsはfloatに変換されますが、コンソール出力を見ると、アプリが3つのオブジェクトを出力しようとしているように見えます。

2012-11-01 10:59:26.338 OAI_Accordion[2402:c07] Section 1 Height
2012-11-01 10:59:26.339 OAI_Accordion[2402:c07] Section 2 Height
2012-11-01 10:59:26.340 OAI_Accordion[2402:c07] -[__NSCFConstantString countByEnumeratingWithState:objects:count:]: unrecognized selector sent to instance 0x9088
2012-11-01 10:59:26.341 OAI_Accordion[2402:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFConstantString countByEnumeratingWithState:objects:count:]: unrecognized selector sent to instance 0x9088'
*** First throw call stack:
(0x1c95012 0x10d2e7e 0x1d204bd 0x1c84bbc 0x1c8494e 0x46e8 0x2c84 0xfb817 0xfb882 0x4aa25 0x4adbf 0x4af55 0x53f67 0x225b 0x177b7 0x17da7 0x18fab 0x2a315 0x2b24b 0x1ccf8 0x1bf0df9 0x1bf0ad0 0x1c0abf5 0x1c0a962 0x1c3bbb6 0x1c3af44 0x1c3ae1b 0x187da 0x1a65c 0x1e9d 0x1dc5 0x1)
libc++abi.dylib: terminate called throwing an exception

どこに間違って設定しているのかわからないので、追加の目が役立つことを期待していました。

4

2 に答える 2

2

ループが原因でアプリケーションがクラッシュしているようです。

for(id obj in sectionHeights) {
    NSLog(@"%@", obj);
}

countByEnumeratingWithState:objects:count:これが、値のディクショナリを誤ってループしようとしているときにエラーが発生する理由である可能性が最も高いです。

次のようなブロックを介した列挙を使用して、辞書をループすることができます。

[sectionHeights enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop)
{
    //
    NSLog(@"key: %@ -> value: %@", key, obj);
}];

これにより、辞書のキーと値を並べてアクセスできます。コンパイラが指定したコンテキストで辞書をどう処理するかを認識していないため、以前の実装はクラッシュします。

高速列挙の構文が必要な場合は、コードを次のように変更して、ディクショナリ値の配列(または必要に応じてキー)をループする必要があります。

for(id obj in [sectionHeights allValues]) {
    NSLog(@"%@", obj);
}

代わりに辞書キーが必要な場合は、[sectionHeightsallKeys]を使用することもできます。

于 2012-11-01T15:48:08.787 に答える
1

これを試してください:

NSDictionary* subSectionData = [sectionObjects objectAtIndex:sectionObjects.count-1];
NSDictionary* sectionHeights = [subSectionData objectForKey:@"Section Heights"];

for(id obj in [sectionHeights allValues]) {
    NSLog(@"%@", obj);
}
于 2012-11-01T15:44:13.863 に答える