从阵列中移除后释放参考指针

时间:2009-08-08 00:48:31

标签: objective-c memory-management autorelease

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

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

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

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

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

  

self.selected = tree;

......通过这样做我知道它被保留了。所以我试着做的就是打电话:

  

[self.selected release];

在从数组中删除树后,我立即调用了它。 ......但是在这一点上崩溃基本上说它已经被释放了。

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

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

3 个答案:

答案 0 :(得分: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] }消息将被发送到旧值,该值已由{{1}}消息发布。

答案 1 :(得分:0)

[可能]发生的是selected指向解除分配的对象,而不是任何内容。

我试试

self.selected = nil;

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

答案 2 :(得分:0)

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