【问题标题】:Pre-allocate memory in iOS在 iOS 中预分配内存
【发布时间】:2014-07-17 18:26:56
【问题描述】:

我的应用在主线程上加载 5 个UIButton(其中 2 个使用自定义图像)、一个UITextView 和一个UITextField,作为对按钮按下的反应。在 iPad 2 上进行测试需要几秒钟,但只是第一次。在那之后,即使在释放所有内容之后,它的加载速度也会快得多。对我来说,iPad似乎首先必须释放一些非活动内存才能加载我的东西。我可以以某种方式提前请求更多可用内存以加快速度吗?

解决方案: 由于问题是由键盘引起的,因此这是最适合我的解决方案:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  // Preloads keyboard so there's no lag on initial keyboard appearance.
  UITextField *lagFreeField = [[UITextField alloc] init];
  [self.window addSubview:lagFreeField];
  [lagFreeField becomeFirstResponder];
  [lagFreeField resignFirstResponder];
  [lagFreeField removeFromSuperview];
}

我还稍微延迟了我的 RootView 的添加,因此延迟不会弄乱我一开始在那里进行的动画。

【问题讨论】:

  • 您从哪里加载自定义图像?
  • 这里的瓶颈是从磁盘加载图像。您应该将它们加载到另一个 dispatch_queueNSOperation
  • 根据各种 cmets 的说法,这可能是释放内存之外的其他事情:您没有证据支持该结论,优化应该始终是有证据的。使用 Instruments 找出真正的瓶颈是什么。

标签: ios objective-c ipad memory


【解决方案1】:

那几秒钟的延迟是您的应用第一次显示键盘。您可以做一些调整来弥补这种延迟,但它们充其量是不雅的。

这不是由于您的代码或分配对象内存,而是 Apple 的做法(节省内存以防您的应用从不使用键盘)。

Check this link out and read more like it.您将了解问题和可能的解决方法。

【讨论】:

    【解决方案2】:

    假设 char 为 1 字节,1 兆字节中有 1 048 576 字节,您可以使用以下代码

    int megaBytesNeeded = 1; // For more memory, run allocation in a loop
    size_t size = sizeof(char) * 1048576 * megaBytesNeeded;
    char *array = malloc(size);
    memset(array, 0, size); // Actually use memory, iOS allocates lazily
    free(array);
    

    但这不是您应该使用的解决方案。我认为您应该打开 Instruments.app 并使用时间分析器来查看导致故障的原因。选择时间段(导致故障)并寻找需要大量时间的选择器。

    【讨论】:

    • 我实际上一直在使用它并且它有效。对于需要依赖内存立即可用的实时应用程序非常有用。然而,有人应该不惜一切代价避免这样的代码。依赖其他应用程序在使用之前不会再次分配内存是不安全的。
    • @Emiswelt:请在自己的答案上发布您的解决方案int megaBytesNeeded = 1; // For more memory, run allocation in a loop size_t size = sizeof(char) * 1048576 * megaBytesNeeded; char *array = malloc(size); memset(array, 0, size); // Actually use memory, iOS allocates lazily free(array);
    【解决方案3】:

    不要假设任何事情。使用 Instruments 分析您的应用程序,看看发生了什么。

    您看到的很可能是图像缓存。如果您使用 imageNamed 加载图像,系统会缓存这些图像,以便下次加载时使用。

    不过,我不认为是这种情况。使用仪器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-19
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      • 2011-09-13
      • 2011-04-28
      • 2012-03-08
      • 2012-07-02
      相关资源
      最近更新 更多