【问题标题】:Why are the objects in my NSMutableArray losing their values for seemingly no reason?为什么我的 NSMutableArray 中的对象似乎无缘无故失去了它们的值?
【发布时间】:2011-12-13 08:30:29
【问题描述】:

我在这里遇到了最奇怪的错误,我希望有人能帮助我解决这个问题。我正处于将现有应用程序转换为 ARC 的(缓慢而痛苦的)过程中。我的应用程序是一个基本的图书阅读器应用程序,它使用 FMDB 与数据库对话。转换很顺利,但我现在崩溃了,我应该加载我的章节名称 tableView。

在我的头文件中,我创建了一个包含所有自定义卷对象的数组:

NSMutableArray * volumes;
}

@property (nonatomic, strong) NSMutableArray * volumes;

到目前为止我还好吗?在 .m 文件中,我合成我的变量,然后在 viewDidLoad 中,我用 db 调用的结果填充数组:

FMDatabase * database = [FMDatabase databaseWithName:name];

FMResultSet * set = [database executeQuery:@"SELECT * FROM book_volumes"];
volumes = [[NSMutableArray alloc] init];

while ([set next]) {
    Volume * v = [[Volume alloc] initWithResultSet:set];
    [volumes addObject:v];
}

这样做的结果是我有 7 个对象填充了数组。如果我在调试器窗口中查看数组内部的值,它们都在其中,并且所有自定义对象都具有它们的所有属性。

当我点击播放时,它转到 numberOfSectionsInTableView:,如果我第一次在这个方法中查看我的数组的值,所有的值仍然存在。但是当点击播放时,它会再次使用相同的方法,numberOfSectionsInTableView:。是对的吗?调用 numberOfSectionsInTableView: 两次?如果我在第二次调用期间查看数组中的值,仍然有 7 个对象,但我无法访问它们的任何值。他们仍然有地址,但尽我所能,他们不可用。

当我们深入到 cellForRowAtIndexPath: 时,这尤其成问题。它崩溃是因为它无法访问卷数组中对象的数据。

我对 ARC 很陌生,所以也许我遗漏了一些东西,但是 ARC 是否有可能让数组的对象过早释放?

我不知道这里会发生什么。我成功地将数据从数据库中检索到数组中,然后在我们填充 tableView 之前它就以某种方式消失了。

我错过了什么?

谢谢!

更新:

所以它仍然不起作用,它仍然让我发疯。我想我会附上我进入 numberOfRowsInSection: 方法时的屏幕截图,然后一切都被炸毁了:

再次更新:

好吧,最终结果是 ARC 转换工具将我的自定义对象的属性更改为在其前面有 __unsafe_unretained。我希望我能早点抓住它。我把它拿出来,把属性改成字符串,错误就消失了。

感谢大家的关注。

【问题讨论】:

  • 看来您的问题出在 Volume 对象上,而不是数组上。你能提供一些细节吗?
  • 显示 Volume 类的 initWithResultSet 中的内容,以及 Volume 的接口是如何声明的。您的问题可能就在那儿
  • @jrturton 我发现这正是您提到的问题所在。我更新了我的帖子以显示发生了什么。随意回答这个问题以获得更多观点:)
  • @oofgwen - 您可以回答自己的问题并在几个小时/天后自己接受。您可以获得自己的积分(甚至是徽章)!

标签: iphone uitableview ios5 nsmutablearray automatic-ref-counting


【解决方案1】:

好吧,最终结果是 ARC 转换工具将我的自定义对象的属性更改为在其前面添加 __unsafe_unretained。我希望我能早点抓住它。我把它拿出来,把属性改成strong,错误就消失了。

感谢大家的关注。

【讨论】:

  • 不要害怕接受你自己的答案作为问题的解决方案。
【解决方案2】:

尝试使用

self.volumes = [[NSMutableArray alloc] init];

而不是

volumes = [[NSMutableArray alloc] init];

【讨论】:

  • ARC 中的合成设置器没有区别。实例变量默认为strong
  • 刚试了下还是不行。我可以获得数据的唯一方法是在 tableView 的每个委托/数据源方法中为它调用数据库,这是一个笑话
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多