【问题标题】:Objective-c iPhone : Region allocation error NSString memory limit?Objective-c iPhone:区域分配错误NSString内存限制?
【发布时间】:2013-09-25 04:40:24
【问题描述】:

在 xcode for iphone 中使用此代码时,我得到一个分配

区域错误。 (使用模拟器)

NSString* str =@"Sommetext";
for (int i =1; i < 50 ; i++) {

    str =  [[[str stringByAppendingString:@"\n"] 

    stringByAppendingString:str] stringByAppendingString:@""];

    NSLog([NSString stringWithFormat:@"%d",i]);

}

监控日志显示从1增加到26然后

崩溃并出现以下错误。

Appname(239,0xac5c9a28) malloc: * mmap(大小=805306368)失败(错误代码=12) * 错误:无法分配区域

但是在我的安卓(三星)上运行相同的代码(在 java 中)

Galaxy S2) 循环 1000 次也没有问题。

更新 1:

使用 GCD 在后台运行代码返回相同的错误,因此它不是主线程过载问题。

更新 2:

运行良好的 Android java 代码

String MsgText = "Some text";

for(i = 0 ; i < amount; i++)
        {
            ////Works on amount < 10000
            //Tested on Galaxy S2 **1GB Ram**
            MsgText = MsgText + MsgText;
        }

【问题讨论】:

  • 小问题(不直接解决这个问题)......你有没有理由不使用 NSMutableString? :-)
  • @SaschaHameister 这有什么帮助?手机仍然会耗尽内存。
  • @Danilo 没有承诺会有所帮助。只是被认为是使用它的冲动,因为它可能会更好。当然,这不会改变有关此问题的任何内容。希望评论仍然可以接受。 (不会用此评论打开新答案。;))

标签: iphone objective-c xcode memory nsstring


【解决方案1】:

26 轮之后,您的 str 将有 671.088.639 个字符的长度。它会崩溃,因为您的 iPhone 在系统中没有足够的内存来分配来存储所有这些。

【讨论】:

  • 但是为什么它在我的android设备上使用具有大致相同内存的java(Galaxy S2)正常工作?
  • @Danilo 很可能是因为 Android 设备对字符串使用了不同的内部表示,或者正在使用 VM,或者正在以其他方式节省内存(可能以 CPU 周期为代价)。同样,您将拥有 大量 带有该代码的自动释放对象,除非您在启用 ARC 的情况下运行并且代码已经过优化。
  • 您也无法在具有 1 GB 内存的 Android 手机上分配 1.342.177.279 个字符(第 27 轮)。您分配的内存不能超过设备实际拥有的内存。
  • 我打赌你的 java 代码会产生不同的结果。检查。运行公共类测试 { public static void main(String[] args) { String str = "Sommetext"; for (int i = 1; i
  • @Danilo:这段代码在我的 android 上完美运行! for(i = 0 ; i 1GB Ram 上测试 MsgText = MsgText + MsgText; }
【解决方案2】:

对于上面的代码,iPhone 没有足够的内存来存储你的strdata,所以它会抛出分配错误并崩溃。

然而,android 使用不同的架构,它可能会使用 cpu,因此代码可以在 android 上运行,尽管它缺乏足够的内存,但在 iPhone 上却不行。

【讨论】:

    猜你喜欢
    • 2012-08-15
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    • 2010-11-25
    • 2017-04-12
    • 2016-09-05
    相关资源
    最近更新 更多