为什么从Objective-C中的superview中删除子视图会造成内存泄漏?

时间:2015-09-28 08:24:58

标签: ios objective-c memory-management uiview memory-leaks

我有UIView的类别,其中包含此方法以删除其所有subviews

- (void)empty {

    for (UIView *subview in self.subviews) {
        [subview removeFromSuperview];
    }
}

在分析我的项目时,我看到多个内存泄漏都指向此代码:

[wrapperView empty];

反过来调用第一种方法。

我在Google上搜索了一个更清晰,更好的解决方案:

[self.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];

不会造成内存泄漏

我的问题是,为什么旧​​的解决方案会造成内存泄漏? UIView *subview循环结束时for是否已发布?

1 个答案:

答案 0 :(得分:1)

在第一种方法中,您在迭代数组时改变数组,在第二种方法中,您只是向数组中的每个对象发送一条消息。

要自己查看,请使用

替换第一种方法
NSArray *subviews = self.subviews.copy;
for (UIView *view in subviews) {
    [view removeFromSuperview];
}

这样您就可以处理子视图数组的副本。