8

由于 iOS 8 中的内存压力,自定义键盘被终止

最初,我的自定义键盘占用了大约 25mb 的内存,但是当我关闭键盘时,这个内存并没有被释放。当我们一次又一次地打开自定义键盘时,内存不断增加,最终由于内存压力而终止。

帮我解决这个问题?

4

3 回答 3

1

你可以在 KeyboardViewController 的 ViewWillDisappear 函数中释放一些东西

于 2014-10-27T14:44:35.183 回答
1

键盘扩展在键盘消失后仍然存在的过程中运行。每次创建键盘时都会重新创建键盘视图控制器,但视图控制器所在的过程仍然存在。所以当你的视图控制器关闭时释放内存。如果您使用的是图像,您将不想使用 imageNamed: 您将需要使用 imageWithContentsOfFile:。因为 UIImage 为 imageNamed 使用缓存,该缓存将持续存在。

于 2015-03-19T00:53:56.177 回答
1

我已经尝试了很多方法来避免这个著名的内存积累问题,但是根据我长期的试验和错误,在键盘消失之前释放所有内存的最好和最简单的方法是调用exit(0).viewWillDisappearKeyboardViewController

- (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) 可以定期调用,但存在一定的卸载风险。

于 2015-09-25T15:39:11.047 回答