0

我是新手,但我阅读了很多关于内存管理的内容,并且真的试图自己找到答案。这听起来很基本,但我显然不明白。我在 .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 的同步访问问题。谢谢大家的帮助。

4

1 回答 1

1
  1. 您显示的代码看起来是正确的;只要您retain在自动释放池耗尽之前将值分配给具有语义的属性,就不需要(或正确)自己调用保留。所有的调用(getDocumentListSortedByDate、getDocumentList)是同步发生的,还是你在后台做这些?仔细检查您是否使用“自我”进行分配。("self.documentListArray =") 而不是直接分配给实例 var ("documentListArray ="); 如果省略“self.”,则绕过设置器。

  2. 不,在分配之前不要释放旧值;这是二传手的工作。

于 2010-11-15T13:27:06.190 回答