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

时间:2012-09-23 15:22:48

标签: objective-c pointers nsdictionary

我有一个从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 param,我就不再有问题而且一切正常。我也尝试通过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"];
}

1 个答案:

答案 0 :(得分:4)

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

@implementation RABMovie {
    NSDictionary *_json;
}

/* ...rest of class */

@end

在@implementation指令之后将其置于花括号中使其成为实例变量。希望这有帮助!

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