【发布时间】: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