3

NSJSONSerializationクラスから辞書を作成するメソッドがあります。次に、json を列挙し、各インスタンスの状態を格納するオブジェクトを作成します。

- (void)fetchedData:(NSData *)responseData {

    NSError* error;
    NSDictionary *json = [NSJSONSerialization
                          JSONObjectWithData:responseData
                          options:kNilOptions
                          error:&error];

    NSArray *moviesJson = [json objectForKey:@"movies"];

    for(NSDictionary *element in moviesJson)
    {
         RABMovie *myMovie = [[RABMovie alloc] initWithJson:element];
       // RABMovie *myMovie = [RABMovie new];
       // myMovie.json = element;

        [_myMovieNames addObject: myMovie];
        myMovie = nil;

    }

    [self.movieTableView reloadData]; 
}

問題:elementアロケータを渡してオブジェクトを作成したいのですが、これを行うと、UITTableViewすべての行に同じ映画データが含まれます。これは常に最後の項目であり、1 つのメモリ アドレスのみを使用して作業していると思われ、最後の更新がコレクション全体に影響します。

alloc パラメータの代わりにプロパティとして使用するコードのコメントを外すjsonと、問題はなくなり、すべて正常に動作します。NSDictionaryまた、ディープコピーを使用してまったく新しいものを作成しようとしましたがelement、役に立ちませんでした。

なぜこれが起こっているのか誰かが知っていますか?ところで、私はARCを使用しています。-時間をありがとう。

編集:さらにコードを追加しました。movieNameivar の使用方法を説明するためにプロパティを含めました_json

@implementation RABMovie

NSDictionary *_json;
- (id) initWithJson: (NSDictionary*) jsonAsDictionary
{
    if (self = [super init])
    {

        _json =  jsonAsDictionary;
    }

    return self;
}

- (NSString*) movieName
{
    return [_json objectForKey:@"title"];
}
4

1 に答える 1

4

_jsonインスタンス変数として宣言するつもりだったと思います。代わりに、それはグローバルに見える (少なくともそのクラス内で) 変数です - スコープ規則について 100% 確実ではありませんが、それはインスタンス変数ではありません - それはすべてのインスタンスによって共有される単一の変数です! 代わりにこれを試してください:

@implementation RABMovie {
    NSDictionary *_json;
}

/* ...rest of class */

@end

@implementation ディレクティブの後の中括弧内に置くと、インスタンス変数になります。お役に立てれば!

編集: jsonRABMovie で呼び出されたプロパティは既にありますか? 次に、インスタンス宣言を完全にスキップすると、コンパイラがインスタンス変数を生成します。それはおそらくすでに実際に起こっているので、プロパティを通過するときに機能します-「グローバル」ではなくivarにアクセスしています。

于 2012-09-23T20:10:43.230 に答える