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行都包含相同的电影数据。它始终是最后一项,让我相信我只使用一个内存地址,并且最后一次更新会影响整个集合。

如果我取消注释代码以将其json用作属性而不是分配参数,则我不再遇到问题并且一切正常。我也尝试NSDictionary通过深层副本创建一个全新的element但无济于事。

有人知道为什么会这样吗?顺便说一句,我正在使用 ARC。-谢谢你的时间。

编辑:添加了更多代码。我已经包含了一个属性movieName来说明我如何使用 ivar _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 指令之后将它放在花括号内使其成为实例变量。希望这可以帮助!

编辑:您是否已经json在 RABMovie 上有一个属性?然后你可以完全跳过实例声明,编译器会为你生成一个实例变量。这可能实际上已经发生了,这就是为什么当您通过该属性时它会起作用 - 它正在访问 ivar 而不是“全局”。

于 2012-09-23T20:10:43.230 回答