在循环中创建对象,但 ivar / 实例变量不保持状态



我有一个从类创建字典的方法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用作属性而不是 alloc 参数,我不再有问题并且一切正常。 我还尝试通过element的深层副本创建一个全新的NSDictionary,但无济于事。

有人知道为什么会这样吗? 顺便说一句,我正在使用 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"];
}

我想你的意思是将_json声明为实例变量。相反,它是一个全局可见(至少在该类中)变量 - 在范围规则上不是 100% 确定,但无论如何,它不是一个实例变量 - 它是所有实例共享的单个变量!试试这个:

@implementation RABMovie {
    NSDictionary *_json;
}
/* ...rest of class */
@end

将其放在 @implementation 指令之后的大括号内,使其成为实例变量。希望这有帮助!

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

最新更新