我是新手,但我阅读了很多关于内存管理的内容,并且真的试图自己找到答案。这听起来很基本,但我显然不明白。我在 .h 中有一个 NSMutableArray 作为属性:
@property (nonatomic, retain) NSMutableArray *documentListArray;
我合成它并在(void)dealloc中释放它。为了填充数组,我有一个方法 - (void)updateRecordList 并在其中:
self.documentListArray=[DocumentDatabase getDocumentListSortedByDate];
编辑:下一行:
[[self recordListTableView] reloadData];
其中 DocumentDatabase 是具有类方法 getDocumentListSortedByDate 和 getDocumentList 的不同类。以下是 getDocumentListSortedByDate 中发生的情况:
NSMutableArray *returnArray = [DocumentDatabase getDocumentList];
//sorting...
NSLog("array count:%i",[returnArray count]); //returns correct numbers first and second time
return returnArray;
并在 getDocumentList
NSMutableArray *returnArray = [NSMutableArray arrayWithCapacity:files.count];
//add file data to array...
return returnArray;
这在我第一次调用 updateRecordList 时有效,但在添加文件并第二次调用 updateRecordList 后,它崩溃(使用 NSZombies): * -[NSCFNumber dealloc]: message sent to deallocated instance 0x7504c90。通过大量日志记录,我将问题缩小到 updateRecordList 中的上述行,如果我将其更改为:
self.documentListArray=[[DocumentDatabase getDocumentListSortedByDate] retain];
我的结论是 getDocumentList 中的数组在到达之前已经自动释放。所以我的问题是:
1. 为什么我必须保留它?这不应该通过声明财产(保留)自行发生吗?或者,换句话说,为什么数组过早地自动释放(假设这是正在发生的事情)?
2.当我给self.documentListArray分配一个新数组时,旧数组会自动释放吗?如果我在获得新的 documentList 之前尝试自己释放它,它也会崩溃。
提前感谢您的任何回复。
编辑:也许我是个白痴:我没有提到 documentListArray 是 UITableView 的数据源(请参阅顶部添加的行)。我怀疑我在填充表格视图时做错了什么,并且数组被保留了......?但是,它确实在分配属性时崩溃,而不是在 reloadData 时崩溃。如果我正确使用 UITableViewDataSource 协议,我会回去学习。感谢大家,您的回答让我有望走上正轨。解决后会更新。
EDIT2:它现在可以在没有保留的情况下工作,我想我理解为什么:我进行了广泛的调试,发现 Objects 中包含的 Objects 添加到了 nil 的数组中。特别是在 encodeWithCoder 的深处,我在赋值时没有使用“self”。解码时,那些值为零。自从我改变了它,它似乎工作了。我怀疑没有分配新数组会导致崩溃,而是 TableView 会读取新数组——甚至在我调用 reloadData 之前。这将导致 Davids 的同步访问问题。谢谢大家的帮助。