我有一个从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"];
}
答案 0 :(得分:4)
我认为您打算将_json
声明为实例变量。相反,它是全局可见的(至少在该类中)变量 - 不是100%确定范围规则,但无论如何,它不是实例变量 - 它是所有实例共享的单个变量!试试这个:
@implementation RABMovie {
NSDictionary *_json;
}
/* ...rest of class */
@end
在@implementation指令之后将其置于花括号中使其成为实例变量。希望这有帮助!
编辑:您是否已在RABMovie上拥有名为json
的媒体资源?然后你可以完全跳过实例声明,编译器会为你生成一个实例变量。这可能实际上已经发生了,这就是为什么当你通过房产时它会起作用 - 它正在访问ivar而不是“全局”。