【问题标题】:NSMutableArray's objects not calling dealloc method after removeAllObjectsNSMutableArray 的对象在 removeAllObjects 后没有调用 dealloc 方法
【发布时间】:2012-07-13 21:36:08
【问题描述】:

我正在尝试让 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");
}

非常感谢任何帮助。

【问题讨论】:

    标签: objective-c ios nsmutablearray automatic-ref-counting


    【解决方案1】:

    阅读您的代码 3 次后,我看不出您的方法有任何缺陷。我认为一切都是正确的,当您从数组中删除所有对象时,应该调用 dealloc 10 次。

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

    • 您确定要在ARC 项目中尝试吗?
    • dealloc 是否在 Item 类中?

    还有一些你做的不对,但是代码和参数是正确的。

    【讨论】:

    • 感谢您的回复。我在一个小型 ARC 项目中运行它,而 dealloc 方法位于 Item 类中。有问题的代码是添加到默认项目的唯一代码(在添加主视图控制器类和项目视图控制器类之后)。我正在使用 Xcode 4.2,在 ios 5.0 模拟器上运行。不知道这是否重要。我会再试一次,看看是否还有其他明显的东西我错过了,因为它对你来说运行正确。另外,如果你不介意的话,还有哪些我做得不对的事情(我仍然在学习 obj-c 和 ios 的方法)。
    • 我的意思是它必须是别的东西,但我现在想不出任何东西。我唯一能做的就是分享我尝试过代码的项目。下载 zip 文件,看看它是否有效:dl.dropbox.com/u/26398429/so_answer.zip
    • 您的项目对我来说也运行正常。谢谢你,我只需要看看你和我的,看看我做了什么不同的事情。当我找到它时,我会再次发表评论。再次感谢。
    • 显然在我的匆忙中,我的简单项目没有为窗口添加根视图控制器。一旦我这样做了,所有的项目都在调用 dealloc。现在的问题(如果我无法弄清楚,可能需要另一个问题)在我的大型项目中,在循环内以任何方式修改项目都会阻止 dealloc。只是创建它,添加它,然后删除它。修改简单项目中的对象工作正常...
    • 发现了我真正的问题。我的项目类将自己添加为我的另一个自定义类的委托。该委托属性被错误地设置为强,因此一旦创建了该项目,其他类就会保留它。
    猜你喜欢
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多