NSMutableArray的对象在调用removeAllObjects方法后没有调用dealloc方法

4
我试图让dealloc方法在存储于可变数组中的某些项目上运行,但似乎找不到让它发生的方式。
在一个较大的ARC项目中遇到了这个问题,并在此帖子中找到了答案:dealloc method is not invoked when set an object to nil。阅读了那篇答案后,我认为自己理解了ARC如何处理下面的代码,然而在一个非常简单的测试项目中运行后,我得到了相同的结果。
在主视图控制器中,我初始化了一个可变数组(一个强属性),并在其中添加了一些其他的视图控制器。然后我删除了所有对象:
- (void)viewDidLoad{
    [super viewDidLoad];

    containerArray = [[NSMutableArray alloc]init];
    for(int i = 0; i < 10; i++){

        //item +1 (item at +1)
        Item *item = [[Item alloc]initWithNibName:nil bundle:nil];

        //item +1 (item at +2)
        [containerArray addObject:item];

        //ARC should release item -1 (item at +1...I think)
    }

    //removeAllObjects should release each item -1 (item(s) at 0)
    [containerArray removeAllObjects];
    //dealloc should be called...
}

在项目视图控制器中:
-(void)dealloc{
    NSLog(@"item dealloc");
}

非常感谢您的帮助。

1个回答

2

看了你的代码三遍后,我没有发现任何问题。我认为一切都是正确的,当你从数组中删除所有对象时,dealloc应该被调用10次。

然后我决定尝试这段代码,我发现...我们都是对的 :) 这段代码是完美的。当我运行它时,我得到了10次项目dealloc输出。

  • 你确定你在一个ARC项目中尝试它吗?
  • dealloc是否在Item类内部?

还有一些你做错了的事情,但是代码和参数都是正确的。


谢谢您的回复。我在一个小型ARC项目中运行这个程序,dealloc方法在Item类内部。所涉及的代码是在默认项目中添加主控制器和项视图控制器类之后添加的唯一代码。我正在使用Xcode 4.2,在ios 5.0模拟器上运行。不知道这里是否有影响。我会再试一下,看看是否还有其他明显的遗漏,考虑到它对您来说已经正常运行了。另外,如果您不介意,那些我没有做对的其他事情是什么(我仍在学习如何使用obj-c和ios)。 - Yeti42
我的意思是它必须是其他东西,但我现在想不出任何东西。我唯一能做的就是分享我尝试代码的项目。下载zip文件并查看是否有效:https://dl.dropbox.com/u/26398429/so_answer.zip - Xavi Gil
你的项目在我这里也正常运行。谢谢你,我只需要看看你和我做了什么不同的地方。当我找到它时,我会再次评论的。再次感谢。 - Yeti42
显然,我匆忙之中,我的简单项目没有为窗口添加根视图控制器。一旦我这样做了,所有的项目都在调用dealloc。现在的问题是(如果我无法解决它,可能需要另一个问题),在我的大型项目中,在循环内以任何方式修改项目都会阻止dealloc。只是创建它,添加它和删除它就可以了。在简单项目中修改对象是可以正常工作的... - Yeti42
找到了真正的问题。我的项目类把自己添加为另一个自定义类的代理。那个代理属性被错误地设置为强引用,因此一旦项目被创建,另一个类就会保留它。 - Yeti42
这就是我所说的应该是其他东西,但没有看到整个代码很难说。我很高兴你能找到问题。 - Xavi Gil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接