从数组和引用指针中删除后释放
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。我删除了“自我”,现在一切都很好,花花公子。 :) 谢谢!
【讨论】:
以上是关于从数组和引用指针中删除后释放的主要内容,如果未能解决你的问题,请参考以下文章