1

因此,在某些情况下,我有一些与删除对象有关的泄漏。

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

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

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

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

self.selected = 树;

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

[self.selected release];

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

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

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

4

3 回答 3

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]消息释放.

于 2009-08-08T03:22:25.530 回答
0

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

我会尝试

self.selected = nil;

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

于 2009-08-08T01:05:20.143 回答
0

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

于 2009-08-11T01:16:25.940 回答