从数组和引用指针中删除后释放

Posted

技术标签:

【中文标题】从数组和引用指针中删除后释放【英文标题】:Releasing after removal from an array & reference pointers 【发布时间】:2009-08-08 00:48:30 【问题描述】:

所以在某些情况下我有与删除对象有关的泄漏。

前提: - 我有一个 NSMutableArray 树对象(树对象知道如何绘制自己)。 - 我有一个参考指针(Tree *selected),它基本上指向我最后接触的任何树。 - 注意 *selected 指针是弱引用。

好的,到目前为止一切顺利。

问题: 当我删除一棵树时会出现泄漏。从列表中,我确保被删除的树在从数组中删除之前在内部释放所有内容(从数组中删除它应该自动调用 release)。

我尝试了什么: 我注意到我的 Tree *selected 指针正在通过 self 属性分配给触摸树:

self.selected = 树;

...通过这样做,我知道它正在被保留。所以我试图做的是调用:

[self.selected release];

我在树从数组中删除后立即调用了它。 ...但此时它崩溃了,基本上说明它已经发布了。

问题: 为什么我会收到此错误消息?我从数组中删除了它,但是我的 self.selected 指针仍然有一个保留的计数,因此我不应该释放它吗?

也许我应该在删除过程之后将其设置为零? 或者,也许我应该在删除过程之前将其设置为自动释放?

【问题讨论】:

让我修改一下我的问题:既然 *selected 指针在数组中保留了对象的计数,为什么从数组中删除该对象会导致它被释放?我保留了对它的引用这一事实应该阻止它被释放,对吗??? 所以我所做的是在不使用 self 关键字的情况下分配 *selected 指针。完成删除过程后,我不会在 ref 指针上调用 release,也不会将其设置为 nil。到目前为止没有泄漏! 该死。泄漏,泄漏,泄漏,它回来了。 你说selected是一个弱引用,然后说它被保留了。在非 GC 上下文中,术语“弱引用”通常意味着它不被保留。你能确认是哪种情况吗? 【参考方案1】:

不要试图对 selected 实例变量的保留/释放进行微观管理。如果您希望 selected 成为弱引用,请使用 assign 属性声明它:

@property(nonatomic, assign) Tree *selected;

这样当你给它赋值时它就不会被保留。从概念上讲,它将“搭载”您的 NSMutableArray 保留的参考。因此,当您从 NSMutableArray 中删除某些内容时,请执行以下操作:

if (self.selected == toBeRemoved)
    self.selected = nil;
[myArray removeObject:toBeRemoved];

如果您没有明确指定 assign 并且您的属性保留了其内容,那么您很可能会遇到异常,因为在删除元素后对 self.selected 的下一次分配导致另一个 -release 消息被发送到旧值,已被您的[self.selected release] 消息释放。

【讨论】:

【参考方案2】:

[可能] 发生的事情是 selected 指向一个已释放的对象,而不是什么都没有。

我会试试的

self.selected = nil;

而不是明确地释放它。这也应该考虑保留计数。

【讨论】:

【参考方案3】:

基本上,我使用'self'分配我的弱引用,因此在内部调用retain。我删除了“自我”,现在一切都很好,花花公子。 :) 谢谢!

【讨论】:

以上是关于从数组和引用指针中删除后释放的主要内容,如果未能解决你的问题,请参考以下文章

字符指针用free释放后,需要设置null吗?

从函数返回一个指针,然后释放指针

java 怎么手动释放数组

仅在一定限度内释放 2D 指针数组的内存

当原始指针和唯一指针都引用同一个对象时,如何避免双重释放?

面试中常被问到C/C++中数组,指针和引用的区别