我在这里遇到了最奇怪的错误,我希望有人可以帮助我度过难关。我正处于将现有应用程序转换为ARC的(缓慢且痛苦的)过程中。我的应用程序是一个基本的书籍阅读器应用程序,它使用FMDB与数据库通信。转换很顺利,但我现在崩溃,我应该加载我的章节名称tableView。
在我的头文件中,我创建了一个包含所有自定义卷对象的数组:
NSMutableArray * volumes;
}
@property (nonatomic, strong) NSMutableArray * volumes;
到目前为止我好吗?在.m文件中我合成了我的变量,然后在viewDidLoad中我用数组调用的结果填充数组:
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
。我希望我早点抓住它。我把它取出并将属性更改为字符串,错误消失了。
感谢所有人看这个。
答案 0 :(得分:3)
好的,最后的结果是ARC转换工具更改了我的自定义对象的属性,使其前面有__unsafe_unretained。我希望我早点抓住它。我把它取出并将属性更改为强,错误消失了。
感谢所有人看这个。
答案 1 :(得分:-1)
尝试使用
self.volumes = [[NSMutableArray alloc] init];
而不是
volumes = [[NSMutableArray alloc] init];