由于 iOS 8 中的内存压力,自定义键盘被终止
最初,我的自定义键盘占用了大约 25mb 的内存,但是当我关闭键盘时,这个内存并没有被释放。当我们一次又一次地打开自定义键盘时,内存不断增加,最终由于内存压力而终止。
帮我解决这个问题?
由于 iOS 8 中的内存压力,自定义键盘被终止
最初,我的自定义键盘占用了大约 25mb 的内存,但是当我关闭键盘时,这个内存并没有被释放。当我们一次又一次地打开自定义键盘时,内存不断增加,最终由于内存压力而终止。
帮我解决这个问题?
你可以在 KeyboardViewController 的 ViewWillDisappear 函数中释放一些东西
键盘扩展在键盘消失后仍然存在的过程中运行。每次创建键盘时都会重新创建键盘视图控制器,但视图控制器所在的过程仍然存在。所以当你的视图控制器关闭时释放内存。如果您使用的是图像,您将不想使用 imageNamed: 您将需要使用 imageWithContentsOfFile:。因为 UIImage 为 imageNamed 使用缓存,该缓存将持续存在。
我已经尝试了很多方法来避免这个著名的内存积累问题,但是根据我长期的试验和错误,在键盘消失之前释放所有内存的最好和最简单的方法是调用exit(0)
.viewWillDisappear
KeyboardViewController
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
exit(0);
}
[更新] exit(0)
非常适合释放所有内存,因为它会终止键盘扩展进程。不幸的是,似乎终止进程会使 iOS 变得不稳定。
因此,最稳定的方法是尽可能多地释放所有已分配的对象viewWillDisappear
。例如,
对于所有自定义视图和所有自定义视图控制器
移除视图和视图控制器的所有强引用,例如子视图、约束、手势、强委托等。
[aView removeFromSuperview];
[aView removeConstraints:aView.constraints];
for (UIGestureRecognizer *recognizer in aView.gestureRecognizers)
[aView removeGestureRecognizer:recognizer];
设置nil
为视图控制器的所有对象属性。
aViewController.anObject = nil;
对于其他大型自定义对象
从所有数组、字典等中删除所有添加的对象。
[anArray removeAllObjects];
不要使用imageNamed:
.
如果释放良好,调试时的内存使用量不会增加或略微增加(每次关闭<0.1MBytes)。如果在多次关闭后内存使用量增加,即使自定义对象被尽可能多地释放,exit(0) 可以定期调用,但存在一定的卸载风险。