这是遍历移除指定类型subview的方法:
- (void)refresh {
for (UIView *view in self.subviews) {
if ([view isMemberOfClass:[GoodListThemeView class]] || [view isMemberOfClass:[SingleGoodsThemeView class]]) {
[view removeFromSuperview];
}
}
}
当调用此方法时,内存变化如下:
如果我将[view removeFromSuperview];
这一句代码注释掉,则不会出现这种内存暴涨后又骤降的现象。
我猜测是那个for循环中产生了大量临时对象导致的,于是我使用autoreleaserpool:
- (void)refresh {
for (UIView *view in self.subviews) {
@autoreleasepool {
if ([view isMemberOfClass:[GoodListThemeView class]] || [view isMemberOfClass:[SingleGoodsThemeView class]]) {
[view removeFromSuperview];
}
}
}
}
但是内存还是突然暴涨然后下降。
谁能提供一点思路。。。
@autoreleasepool
的作用,它的真实作用是 如果在包裹语句中创建了临时变量,则可以提前释放,显然你使用情景并不符合这一原则,故无效for... in ...
快速枚举原则上是不应该对集合中的元素作修改的,也许可以试试块遍历(但我觉得应该差不太多,for in
见到用的例子也挺多的),for循环不考虑是因为会导致多出一份临时拷贝removeFromSuperview
后并不代表这块内存就释放了,正确的说法是会在稍后的某个时间点释放(一般是下一次事件循环),如果要及时释放,可直接手动置空,view = nil;