【发布时间】:2011-05-10 05:37:58
【问题描述】:
我是新手,但我阅读了很多关于内存管理的内容,并且真的试图自己找到答案。 这听起来很基本,但我显然不明白。 我在 .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]:消息发送到已释放实例 0x7504c90。 通过大量日志记录,我将问题缩小到 updateRecordList 中的上述行,如果我将其更改为:
self.documentListArray=[[DocumentDatabase getDocumentListSortedByDate] retain];
我的结论是 getDocumentList 中的数组在到达之前已经自动释放。所以我的问题是:
1. 为什么我必须保留它?这不应该通过声明财产(保留)自行发生吗?
或者,换句话说,为什么数组过早自动释放(假设这是正在发生的事情)?
2.当我给self.documentListArray分配一个新数组时,旧数组会自动释放吗?如果我在获得新的 documentList 之前尝试自己释放它,它也会崩溃。
提前感谢您的回复。
编辑: 也许我是个白痴:我没有提到 documentListArray 是 UITableView 的数据源(请参阅顶部添加的行)。我怀疑我在填充表格视图时做错了什么,并且数组被保留了......?但是,它确实在分配属性时崩溃,而不是在 reloadData 时崩溃。 如果我正确使用 UITableViewDataSource 协议,我会回去学习。感谢大家,您的回答让我有望走上正轨。解决后会更新。
编辑2: 它现在可以在没有保留的情况下工作,我想我明白了原因:我进行了广泛的调试,发现 Objects 中包含的 Objects 添加到了 nil 的数组中。特别是在 encodeWithCoder 的深处,我在赋值时没有使用“self”。解码时,那些值为零。自从我改变了它,它似乎工作了。 我怀疑没有分配新数组会导致崩溃,但是 TableView 会读取新数组——甚至在我调用 reloadData 之前。这将导致 Davids 的同步访问问题。谢谢大家的帮助。
【问题讨论】:
-
你自己写了 setter 吗?
-
我不认为这是你的问题,但你应该在
-dealloc方法中使用releasedocumentListArray,而不是dealloc它 -
太快了,太棒了! @Felix,不,我没有自己的设置器,只有属性合成模式。 @David,我使用了错误的术语,实际上我确实“发布”了它-现在将对其进行编辑。
-
你能告诉我们
[DocumentDatabase getDocumentListSortedByDate]返回什么(我的意思是分配/保留和释放)吗? -
很高兴,但是如何?你想让我 NSLog 保留计数吗?另外,我应该在评论中还是在原始帖子中发布这个?
标签: iphone properties nsmutablearray retain autorelease