NSXMLParser を使用して、リモート サーバーから XML データを解析しています。チュートリアルに従って起動して実行しましたが、作成しているオブジェクトにある (NSString *) メンバーはすべて問題ありません。また、次のような XML データから設定する必要がある整数もあります。
<root>
<child>
<name> Hello </name>
<number> 123 </number>
</child>
<child>
<name> World</name>
<number> 456 </number>
</child>
</root>
この場合、2 つの「子」オブジェクトを作成します。私は使用しています:
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
...
[aChild setValue:currentElementValue forKey:elementName];
...
}
値の設定を委譲します。これが私の問題に到達する場所です。「NSString *name」メンバーは毎回正常に設定されますが、NSInteger を使用すると、「number」を設定しようとするたびに EXC_BAD_ACCESS が発生します。そこで、代わりに「int」を使用してみました。しかし、今はキー値プログラミングを使用できず、ノードを手動で探す必要があります。
if([elementName isEqualToString:@"number"]) {
aChild.number = [currentElementValue intValue]
}
これは大丈夫です。取得するノードがわかっているので対処できますが、さらに悪化します。チュートリアルのように currentElementValue が "NSMutableString *" の場合、文字列が正しいにもかかわらず、正しい整数が返されません。例えば:
NSLog(@"NSMutableString Value: %@, and intValue %d\n", currentElementValue, [currentElementValue intValue]);
// Value will be 123 but intValue will be 0
そこで、currentElementValue を NSMutableString ではなく NSString にすると、適切な intValue を取得できます。しかし、それが NSMutableString である理由は次のとおりであることをオンラインで読みました。
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
値を設定するために使用されるデリゲートは複数回発生する可能性がありますが、通常は発生しません。だから私の質問は、私が間違っていることを誰かが知っていますか? これは NSXMLParser のかなり些細なケースのように思えるので、私が誤解しているものだと確信しています。