0

iPhone の開発を勉強していて、plist ファイルの読み書きの問題に直面しています。iPhone 開発本の例に従いましたが、実行時にエラー メッセージが表示され続けます。

エラーメッセージは次のとおりです: 2012-04-26 00:21:09.759 FileHandling[5915:207] -[__NSCFDictionary addObject:]: 認識されないセレクターがインスタンス 0x685ac40 に送信されました

これがサンプルコードです(私には問題ないようですが...):

NSString *plistFileName = [[self documentPath] stringByAppendingPathComponent: @"Apps.plist"];
NSLog(@"Where is the file? => %@", plistFileName);

if ([[NSFileManager defaultManager] fileExistsAtPath:plistFileName]) {
    NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:plistFileName];

    for (NSString *category in dict) {
        NSLog(@"%@", category);
        NSLog(@"=========");

        NSArray *titles = [dict valueForKey:category];

        for (NSString *title in titles) {
            NSLog(@"%@", title);
        }
    }
} else {
    NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"Apps" ofType: @"plist"];       
    NSLog(@"%@", plistPath);
    NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile: plistPath];
    NSLog(@"Let's take a look : %@", dict); 
    NSMutableDictionary *copyOfDict = [dict mutableCopy];
    NSLog(@"Let's look at the mutable dictationary : %@", copyOfDict);
    NSArray *categoriesArray = [[copyOfDict allKeys] sortedArrayUsingSelector: @selector(compare:)];

    for (NSString *cateogry in categoriesArray) {
        NSArray *titles = [dict valueForKey: cateogry];
        NSMutableArray *mutableTitles = [titles mutableCopy];

        [mutableTitles addObject: @"New App Title"];

        [copyOfDict setObject: mutableTitles forKey:cateogry];
    }

    NSString *fileName = [[self documentPath] stringByAppendingPathComponent: @"Apps.plist"];
    [copyOfDict writeToFile: fileName atomically:YES];
}
4

1 に答える 1

1

エラーメッセージによると、問題はの呼び出しで発生していaddObject:ます__NSCFDictionary。これは、実行時に、辞書がオブジェクトを追加するためのメッセージを受信したことを意味します。

ただし、このコードスニペットでaddObject:は、がに送信されているようNSMutableArrayです。これはおそらく、最後のforループでtitles取得している各オブジェクトがdict配列ではなく、実際には別の辞書であり、コードが単に配列として参照していることを意味します。

実際、コードは整形式のように見えるので、ソースplistの整形式を確認してください。プレーンテキストエディタで開きます。また、大量のログを使用するため、次のように確認してください。出力では、辞書(ルートエントリを含む)は、で示され{curly = braces}、配列は。で示され(round parentheses)ます。

于 2012-05-02T04:24:03.840 に答える