Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在iOS中预分配内存_Ios_Objective C_Ipad_Memory - Fatal编程技术网

在iOS中预分配内存

在iOS中预分配内存,ios,objective-c,ipad,memory,Ios,Objective C,Ipad,Memory,我的应用程序在主线程上加载5个UIButton(其中2个使用自定义图像)、一个UITextView和一个UITextField,作为按下按钮的反应。在iPad2上进行测试需要几秒钟,但这只是第一次。之后,即使在发布了所有内容之后,它的加载速度也要快得多。对我来说,似乎iPad首先必须释放一些不活动的内存才能加载我的东西。我是否可以提前请求更多的内存以加快速度 解决方案: 由于问题是由键盘引起的,这是最适合我的解决方案: - (BOOL)application:(UIApplication *)a

我的应用程序在主线程上加载5个
UIButton
(其中2个使用自定义图像)、一个
UITextView
和一个
UITextField
,作为按下按钮的反应。在iPad2上进行测试需要几秒钟,但这只是第一次。之后,即使在发布了所有内容之后,它的加载速度也要快得多。对我来说,似乎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兆字节中有1048576字节,您可以使用以下代码

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,使用时间分析器来查看是什么导致了你的故障。选择时间段(导致故障)并查找花费大量时间的选择器

不要做任何假设。使用仪器分析您的应用程序并查看发生了什么

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


不过,我也不认为是这样。使用仪器。

从何处加载自定义图像?此处瓶颈的可能重复是从磁盘加载图像。您应该将它们加载到另一个
dispatch_队列
NSOperation
上,根据各种评论,这可能是释放内存以外的事情:您没有证据支持这一结论,优化应该始终是证据。使用仪器,找出真正的瓶颈是什么。我一直在使用它,它是有效的。对于需要依靠内存立即可用的实时应用程序非常有用。然而,应该有人不惜一切代价避免这样的代码。在使用之前,依赖其他应用程序不会再次分配内存是不安全的。@emisswelt:请发布您的解决方案
int megabytesseeded=1;//要获得更多内存,请在循环中运行分配需要的大小\u t size=sizeof(char)*1048576*兆字节;字符*数组=malloc(大小);memset(数组,0,大小);//实际使用内存时,iOS会延迟分配空闲内存(数组)在它自己的答案上。