gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 20:06:15 25 4
gpt4 key购买 nike

我有一个从 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 而不是“全局”。

关于objective-c - 在循环中创建对象,但 ivar/实例变量不保持状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12553551/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com