在iOS中预分配内存

时间:2014-05-28 13:35:57

标签: ios objective-c ipad memory

我的应用加载5 UIButton(其中2个使用自定义图片),主线程上的UITextViewUITextField作为按钮按下的反应。在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,所以滞后不会搞砸我在开始时就会进行的动画。

3 个答案:

答案 0 :(得分:1)

第二次延迟是您的应用首次显示键盘。你可以做一些调整来弥补这种延迟,但它们最多也是不优雅的。

这不是由于您的代码或分配您的对象内存,而是苹果公司这样做的方式(在您的应用永远不使用键盘的情况下节省内存)。

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

答案 1 :(得分:1)

假设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并使用时间分析器来查看导致故障的原因。选择时间段(导致故障)并查找占用大量时间的选择器。

答案 2 :(得分:0)

不要假设任何事情。使用仪器描述您的应用程序,看看发生了什么。

您所看到的很可能是图像缓存。如果使用imageNamed加载图像,系统会在下次加载图像时对其进行缓存。

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