我有一个 UIView
类别,其中包含此方法来删除其所有 subview
:
- (void)empty {
for (UIView *subview in self.subviews) {
[subview removeFromSuperview];
}
}
在分析我的项目时,我发现多个内存泄漏都指向此代码:
[wrapperView empty];
它又调用第一个方法。
我在 Google 上搜索并找到了一个更干净、更好的解决方案:
[self.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
不会造成内存泄漏。
我的问题是,为什么旧的解决方案会造成内存泄漏? UIView *subview
不是在 for
循环结束时释放的吗?
最佳答案
在第一种方法中,您在迭代数组时改变数组,在第二种方法中,您只是向数组中的每个对象发送一条消息。
要亲自查看这一点,请将第一个方法替换为
NSArray *subviews = self.subviews.copy;
for (UIView *view in subviews) {
[view removeFromSuperview];
}
这样您就可以处理 subview 数组的副本。
关于ios - 为什么在 Objective-C 中从父 View 中删除 subview 会造成内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32818611/