在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/iOS/ remove大量view時(shí)導(dǎo)致內(nèi)存急劇增長該如何處理?

remove大量view時(shí)導(dǎo)致內(nèi)存急劇增長該如何處理?

這是遍歷移除指定類型subview的方法:

- (void)refresh {
    for (UIView *view in self.subviews) {
        if ([view isMemberOfClass:[GoodListThemeView class]] || [view isMemberOfClass:[SingleGoodsThemeView class]]) {
            [view removeFromSuperview];
        }
    }
}

當(dāng)調(diào)用此方法時(shí),內(nèi)存變化如下:

如果我將[view removeFromSuperview];這一句代碼注釋掉,則不會(huì)出現(xiàn)這種內(nèi)存暴漲后又驟降的現(xiàn)象。

我猜測(cè)是那個(gè)for循環(huán)中產(chǎn)生了大量臨時(shí)對(duì)象導(dǎo)致的,于是我使用autoreleaserpool:

- (void)refresh {
    for (UIView *view in self.subviews) {
        @autoreleasepool {
            if ([view isMemberOfClass:[GoodListThemeView class]] || [view isMemberOfClass:[SingleGoodsThemeView class]]) {
                [view removeFromSuperview];
            }
        }
    }
}

但是內(nèi)存還是突然暴漲然后下降。

誰能提供一點(diǎn)思路。。。

回答
編輯回答
蟲児飛
  1. 需要@autoreleasepool的作用,它的真實(shí)作用是 如果在包裹語句中創(chuàng)建了臨時(shí)變量,則可以提前釋放,顯然你使用情景并不符合這一原則,故無效
  2. for... in ...快速枚舉原則上是不應(yīng)該對(duì)集合中的元素作修改的,也許可以試試塊遍歷(但我覺得應(yīng)該差不太多,for in見到用的例子也挺多的),for循環(huán)不考慮是因?yàn)闀?huì)導(dǎo)致多出一份臨時(shí)拷貝
  3. removeFromSuperview后并不代表這塊內(nèi)存就釋放了,正確的說法是會(huì)在稍后的某個(gè)時(shí)間點(diǎn)釋放(一般是下一次事件循環(huán)),如果要及時(shí)釋放,可直接手動(dòng)置空,view = nil;
2018年8月11日 11:17
編輯回答
離魂曲

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

2018年9月17日 11:05
編輯回答
九年囚

內(nèi)存暴漲,我懷疑是removeFromSuperview方法延時(shí)生效造成的,可能在生效之前for循環(huán)在不斷執(zhí)行造成內(nèi)存暴漲,解決方法還是手動(dòng)置空吧

2017年4月8日 12:54
編輯回答
傲嬌范

我猜 for循環(huán)是removeFromSuperview方法是一個(gè) 異步耗時(shí)操作。 需要占內(nèi)存比較大 , 想辦法移除完成一個(gè)后在移除下一個(gè)。搞一個(gè)同步之類的。

2017年2月14日 23:39
編輯回答
你的瞳

改成阻塞去做,棄用循環(huán),寫一個(gè)迭代器函數(shù)并遞歸自身

2018年1月19日 13:42
編輯回答
獨(dú)白

既然你看到內(nèi)存暴漲了,你有沒有用 Instruments 看一下這個(gè)時(shí)間段的 Allocation trace?這段時(shí)間里有哪些對(duì)象被創(chuàng)建或者有哪些 malloc 發(fā)生?

2018年4月17日 00:42