iOS过早发布对象 - 可能与Autorelease和Copy混淆

时间:2011-09-01 08:00:26

标签: objective-c ios copy autorelease

我写了一个带有自定义搜索类的应用程序。这会构建一系列结果。

然后我将该数组分配到我的FirstViewController类中,并重新加载一个分配了结果数组的表视图

self.aResults = [thisSearch.aResults copy]
...
[[self searchResults] reloadData];

这样做之后不久,我发布 thisSearch

[thisSearch release];

这一切工作正常,并显示结果表,但是如果我向下滚动表并查看下面的行,它们都是空白的,那么当我向上滚动时,应用程序会在重新加载回收的表格单元格时崩溃。

之前没有发生这种情况,但我意识到我在泄漏记忆,所以我疯狂地 autorelease ,并在我的中添加了很多 autorelease 搜索类。但不是我的 FirstViewController 类。

因此,如果我使用复制,它是否实际上不会复制该对象,它是否会增加引用计数器?因此,当我销毁搜索时,我是否在那里销毁结果数组,因此破坏了FirstViewController尝试访问表视图的内容?

对不起,如果这没有多大意义,我今天感觉不太好。

1 个答案:

答案 0 :(得分:1)

当你copy个对象时(为了使对象必须符合NSCopying协议,但NSArray的情况就是如此),就好像你是init首次使用预定值来实现它。

因此,您对release的{​​{1}}个对象负责。

你必须做的事情:

copied

但我怀疑这会解决你的记忆问题。通过过度自动释放(并且仍在发布内容),您可能已经完全破坏了应用程序内存管理。

要尝试修复它,请尝试分析您的项目,看看会出现什么。

enter image description here

另外,我附上每月应该阅读的Apple Memory Management link,直到它成为第二天性。