在iOS中预分配内存



我的应用程序加载了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添加一点,所以延迟不会弄乱动画我有在那里开始

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

这不是由于你的代码或分配你的对象内存,这是苹果做这件事的方式(节省内存,以防你的应用程序从不使用键盘)

查看这个链接并阅读更多类似的内容。您将了解问题和可能的解决方法。

假设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);

但这不是您应该使用的解决方案。我觉得你应该打开乐器。应用程序,并使用时间分析器来查看导致故障的原因。选择时间段(导致故障)并查找花费大量时间的选择器。

不要做任何假设。使用工具配置你的应用程序,看看发生了什么。

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

再次强调,我不认为是这种情况。使用工具。

最新更新