【问题标题】:I have to retain a NSMutableArray although it's a property我必须保留一个 NSMutableArray 虽然它是一个属性
【发布时间】: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 方法中使用 release documentListArray,而不是 dealloc
  • 太快了,太棒了! @Felix,不,我没有自己的设置器,只有属性合成模式。 @David,我使用了错误的术语,实际上我确实“发布”了它-现在将对其进行编辑。
  • 你能告诉我们[DocumentDatabase getDocumentListSortedByDate]返回什么(我的意思是分配/保留和释放)吗?
  • 很高兴,但是如何?你想让我 NSLog 保留计数吗?另外,我应该在评论中还是在原始帖子中发布这个?

标签: iphone properties nsmutablearray retain autorelease


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

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

【讨论】:

  • 感谢您的回答。我仔细检查了一下,确实使用了 self.documentListArray。此外,updateRecordList 是我更改数组的唯一地方,所有其他地方都只使用它。我相信它是同步发生的,因为它是以线性方式调用的,如上所示。但我的知识还不足以完全确定。但也许它与 DocumentDatabase 中的方法是类方法有关?
  • 查看我的帖子,我意识到 DocumentDatabase 是另一个类可能并不明显。现在这可能是一个真正的菜鸟问题:这对自动释放池有影响吗?
猜你喜欢
  • 1970-01-01
  • 2012-09-28
  • 2011-06-29
  • 1970-01-01
  • 2019-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多