4

最初に、アプリフォルダー内のローカルファイルにアクセスしようとしています:

    NSData *data = [NSData dataWithContentsOfFile:
                                      [@"countries.json" stringByExpandingTildeInPath]];

結果は常に NULL です

次に、ファイルが存在するかどうかを確認しようとしました:

    NSString* documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString* foofile = [documentsPath stringByAppendingPathComponent:@"countries.json"];
    BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:foofile];

存在しないので、次のコードを使用して json ファイルにアクセスします。

    NSString *data1 = [[NSBundle mainBundle] pathForResource:@"countries" ofType:@"json"];
    NSData *data2 = [[NSData alloc] initWithContentsOfFile:data1];

ファイルを取得していますが、解析しようとすると:

    NSDictionary *dict1 =[data2 yajl_JSON];

エラーが発生しました:

    [NSConcreteData yajl_JSON]: unrecognized selector sent to instance 0x6838d60

私の質問は次のとおりです。

  • NSData を NSConcreteData に変換する機会はありますか?

  • データにアクセスするために正しいアプローチを使用していますか?


API ドキュメント - http://gabriel.github.com/yajl-objc/

Xcode ビルド フェーズのスクリーンショット:

ここに画像の説明を入力

4

1 に答える 1

3

YAJLのドキュメントによると、呼び出そうとしているメソッドは実際に存在します。

それはただ1つのオプションを残します。YAJLフレームワークに対して完全にリンクしていません。

私の例のように、アプリターゲットのリンクされたフレームワーク/ライブラリのリストに表示されていることを確認してくださいCFNetwork.framework

ここに画像の説明を入力してください

呼び出そうとしているメソッドは実際にはのカテゴリの一部であるため、他のリンカーフラグNSDataに必ず含め-ObjCてください。

ここに画像の説明を入力してください

AppleのテクニカルQ&Aから

このフラグにより​​、リンカは、Objective-Cクラスまたはカテゴリを定義するライブラリ内のすべてのオブジェクトファイルをロードします。このオプションを使用すると、通常、実行可能ファイルが大きくなりますが(アプリケーションに追加のオブジェクトコードが読み込まれるため)、既存のクラスのカテゴリを含む効果的なObjective-C静的ライブラリを正常に作成できます。

于 2012-04-28T23:13:13.707 に答える