ios - 为什么在 Objective-C 中从父 View 中删除 subview 会造成内存泄漏?

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

我有一个 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/

相关文章:

memory-management - iOS 7 内存问题

c - BSS段内存布局

ios - 从服务器获取 JSON 后如何更新应用程序中的标签?如果应该实时更新

ios - 当时间(iOS 时钟)发生变化时,有什么方法可以运行代码吗?

html - UIWebview:如何在 html 链接之前放置一个图标并在点击时突出显示

iphone - if(self = [super init]) - LLVM 警告!你是怎么处理的?

c - 在一个 malloc 中为元素分配结构和内存

ios - 在 SwiftUI 中使用分段式选取器在两个页面之间滑动

ios - 包含 NSString 数组的 JSON

objective-c - 现代 Objective-C (2013) 和声明 ivars/使用@property、@dynamic 和@synthesize