在学习 iOS 开发时,使用 subdataWithRange:NSMakeRange 遇到一个问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
childs
V2EX    iDev

在学习 iOS 开发时,使用 subdataWithRange:NSMakeRange 遇到一个问题

  •  
  •   childs 2015-02-28 09:30:10 +08:00 8522 次点击
    这是一个创建于 3902 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我在加载存到数据库中的pdf文件(大约14M)的二进制数据时,通过

    [data appendData:[self.archiveData subdataWithRange:NSMakeRange(self.offset, len)]];加载数据
    len是int类型offset是NSInteger类型。
    self.offset += len;
    但是当self.offset增加到差不多7M左右的时候就会报错。错误如下:
    *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** NSAllocateMemoryPages(14082573) failed'
    *** First throw call stack:
    (
    0 CoreFoundation 0x06345946 exceptionPreprocess + 182
    1 libobjc.A.dylib 0x05fcea97 objc_exception_throw + 44
    2 CoreFoundation 0x0634586d +[NSException raise:format:] + 141
    3 Foundation 0x04f800ac NSAllocateMemoryPages + 106
    4 Foundation 0x04e8e643 _NSDataCreateVMDispatchData + 34
    5 Foundation 0x04e8c83a -[_NSPlaceholderData initWithBytes:length:copy:deallocator:] + 252
    6 Foundation 0x04e8c72d -[NSData(NSData) initWithBytes:length:copy:freeWhenDone:bytesAreVM:] + 92
    7 Foundation 0x04ee9363 -[NSData(NSData) copyWithZone:] + 144
    8 CoreFoundation 0x062c4ce9 -[
    NSCFData copyWithZone:] + 105
    9 Foundation 0x04f33531 -[NSSubrangeData initWithData:range:] + 484
    10 Foundation 0x04ef3727 -[NSData(NSData) subdataWithRange:] + 657
    11 ESPTablet 0x00edf137 -[CWHessianUnarchiver(Private) readDataWithTag:] + 189
    12 ESPTablet 0x00edf1b3 -[CWHessianUnarchiver(Private) readDataWithTag:] + 313
    13 ESPTablet 0x00edf1b3 -[CWHessianUnarchiver(Private) readDataWithTag:] + 313
    14 ESPTablet 0x00edf1b3 -[CWHessianUnarchiver(Private) readDataWithTag:] + 313
    15 ESPTablet 0x00edf1b3 -[CWHessianUnarchiver(Private) readDataWithTag:] + 313
    16 ESPTablet 0x00edf1b3 -[CWHessianUnarchiver(Private) readDataWithTag:] + 313
    17 ESPTablet 0x00edf1b3 -[CWHessianUnarchiver(Private) readDataWithTag:] + 313
    。。。。错误还有很多没有全贴出来

    这个错误好像是分配内存失败了
    请教各位大神,知道这是什么原因吗?

    7 条回复    2015-03-01 01:41:52 +08:00
    keithellis
        1
    keithellis  
       2015-02-28 09:59:49 +08:00
    内存泄露吧
    hyzjshwo
        2
    hyzjshwo  
       2015-02-28 10:03:16 +08:00   1
    恩 没有更多代码 我赌你是内存分配过大,中间产生的内存超过栈的上限了。。。要么修改栈大小,要么控制产生的临时内存空间。
    flicker317
        3
    flicker317  
       2015-02-28 10:20:38 +08:00
    @hyzjshwo 应该是堆吧
    hyzjshwo
        4
    hyzjshwo  
       2015-02-28 10:23:15 +08:00
    @flicker317 那要看他具体代码了
    childs
        5
    childs  
    OP
       2015-02-28 10:29:40 +08:00
    @hyzjshwo
    ESPTablet[8934:184080] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** NSAllocateMemoryPages(14082573) failed'
    *** First throw call stack:
    (
    0 CoreFoundation 0x063b9946 __exceptionPreprocess + 182
    1 libobjc.A.dylib 0x06042a97 objc_exception_throw + 44
    2 CoreFoundation 0x063b986d +[NSException raise:format:] + 141
    3 Foundation 0x04ff40ac NSAllocateMemoryPages + 106
    4 Foundation 0x04f02643 _NSDataCreateVMDispatchData + 34
    5 Foundation 0x04f0083a -[_NSPlaceholderData initWithBytes:length:copy:deallocator:] + 252
    6 Foundation 0x04f0072d -[NSData(NSData) initWithBytes:length:copy:freeWhenDone:bytesAreVM:] + 92
    7 Foundation 0x04f5d363 -[NSData(NSData) copyWithZone:] + 144
    8 CoreFoundation 0x06338ce9 -[__NSCFData copyWithZone:] + 105
    9 Foundation 0x04fa7531 -[NSSubrangeData initWithData:range:] + 484
    10 Foundation 0x04f67727 -[NSData(NSData) subdataWithRange:] + 657
    11 ESPTablet 0x00f53134 -[CWHessianUnarchiver(Private) readDataWithTag:] + 218
    12 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    13 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    14 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    15 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    16 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    17 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    18 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    19 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    20 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    21 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    22 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    23 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    24 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    25 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    26 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    27 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    28 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    29 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    30 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    31 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    32 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    33 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    34 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    35 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    36 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    37 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    38 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    39 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    40 ESPTablet 0x00f531ba -[CWHessianUnarhiver(Private) readDataWithTag:] + 352
    41 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    42 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    43 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    44 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    45 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    46 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    47 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    48 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    49 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    50 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    51 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    52 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    53 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    54 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    55 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    56 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    57 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    58 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    59 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    60 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    61 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    62 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    63 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    64 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    65 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    66 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    67 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    68 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    69 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    70 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    71 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    72 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    73 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    74 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    75 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    76 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    77 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    78 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    79 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    80 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    81 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    82 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    83 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    84 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    85 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    86 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    87 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    88 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    89 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    90 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    91 ESPTablet 0x00f531ba -[CWHessianUnarchiver(Private) readDataWithTag:] + 352
    目前只能贴这么多 剩下的错误跟这些类似
    hyzjshwo
        6
    hyzjshwo  
       2015-02-28 10:37:13 +08:00
    @childs 我不知道你要干什么事 但是这句代码暴露了你或者你们对内存管理上的一些缺陷
    [data appendData:[self.archiveData subdataWithRange:NSMakeRange(self.offset, len)]];
    这段在内存里会有两份pdf大小的空间。data这个变量来看你似乎只是临时使用,那你为什么要一段一段取self.archiveData 而不是直接使用呢?还有兄弟,如果是必现的bug都是最容易解决的bug。
    tuoxie007
        7
    tuoxie007  
       2015-03-01 01:41:52 +08:00
    看起来就是系统无法一次性申请到这么大的内存,因为你subdata出来的其实是个数组。总之大文件的处理最好不能一次性读到内存里,否则再多内存也不够你用,得分段处理数据流啊
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1030 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 22:54 PVG 06:54 LAX 14:54 JFK 17:54
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86