代码之家  ›  专栏  ›  技术社区  ›  vayfi

NSData到NSArray的错误原因如下:'-[__NSCFArray bytes]:

  •  2
  • vayfi  · 技术社区  · 9 年前

    //**加载阵列部件

      NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
      NSData *data = [defaults objectForKey:@"mainScreenFavVenues"];
      _venuesInfo = (NSArray *)[NSKeyedUnarchiver unarchiveObjectWithData:data];
    

    //**保存阵列部分

        NSMutableArray *archiveArray = [NSMutableArray arrayWithCapacity:_venuesInfo.count];
        for (Venue *venueObject in _venuesInfo) {
            NSData *venueEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:venueObject];
            [archiveArray addObject:venueEncodedObject];
        }
    
        NSUserDefaults *userData = [NSUserDefaults standardUserDefaults];
        [userData setObject:archiveArray forKey:@"mainScreenFavVenues"];
    

    保存部分完全工作,当我调用加载部分xcode时给我这个错误;

    错误:***由于未捕获的异常而终止应用程序 “NSInvalidArgumentException”,原因:“-[__NSCFArray bytes]:

    注: _venuesInfo 自定义对象我得到了场地对象和这个对象 已经得到了 encodeWithCoder initWithCoder

    此外,当我调试加载部分时,nsdata得到了带有字节的对象,但我无法将字节数据转换为数组。

    编辑:

    <__NSCFArray 0x1742a3c00>(
    <62706c69 73743030 d4010203 04050630 31582476 65727369 6f6e5824 6f626a65 63747359 24617263 68697665 72542474 6f701200 0186a0a7 07082526 27282955 246e756c 6cde090a 0b0c0d0e 0f101112 13141516 17181917 17171d17 1f171717 17245e76 656e7565 73446973 74616e63 655f100f 76656e75 6573496d 6167654c 696e6b58 76656e75 65734944 5e76656e 75657349 636f6e4c 696e6b57 76656e75 6543435c 76656e75 65436f75 6e747279 5624636c 6173735d 76656e75 65734164 64726573 735a7665 6e756573 4e616d65 5976656e 7565734c 6e675976 656e7565 43697479 5976656e 7565734c 61745a63 61746567 6f727949 445b676f 7a7a6970 436f756e 74800080 04800380 00800080 00800680 00800280 00800080 00800080 055b4275 72676572 204b696e 6710415f 10626874 7470733a 2f2f6972 73302e34 7371692e 6e65742f 696d672f 67656e65 72616c2f 39353978 3731372f 34313535 35303433 5f515251 58624e31 3435374c 6249535f 71625945 4b72356f 537a695a 7742435a 594b4f47 4d775771 654a7377 2e6a7067 11022cd2 2a2b2c2d 5a24636c 6173736e 616d6558 24636c61 73736573 5556656e 7565a22e 2f555665 6e756558 4e534f62 6a656374 5f100f4e 534b6579 65644172 63686976 6572d132 3354726f 6f748001 00080011 001a0023 002d0032 0037003f 00450062 00710083 008c009b 00a300b0 00b700c5 00d000da 00e400ee 00f90105 01070109 010b010d 010f0111 01130115 01170119 011b011d 011f0121 012d012f 01940197 019c01a7 01b001b6 01b901bf 01c801da 01dd01e2 00000000 00000201 00000000 00000034 00000000 00000000 00000000 000001e4>,
    <62706c69 73743030 d4010203 04050630 31582476 65727369 6f6e5824 6f626a65 63747359 24617263 68697665 72542474 6f701200 0186a0a7 07082526 27282955 246e756c 6cde090a 0b0c0d0e 0f101112 13141516 17181917 17171d17 1f171717 17245e76 656e7565 73446973 74616e63 655f100f 76656e75 6573496d 6167654c 696e6b58 76656e75 65734944 5e76656e 75657349 636f6e4c 696e6b57 76656e75 6543435c 76656e75 65436f75 6e747279 5624636c 6173735d 76656e75 65734164 64726573 735a7665 6e756573 4e616d65 5976656e 7565734c 6e675976 656e7565 43697479 5976656e 7565734c 61745a63 61746567 6f727949 445b676f 7a7a6970 436f756e 74800080 04800380 00800080 00800680 00800280 00800080 00800080 056f1017 0042006f 0072006e 006f0076 00610020 004d0065 00740072 006f0020 01300073 00740061 00730079 006f006e 0075104c 5f106268 74747073 3a2f2f69 7273302e 34737169 2e6e6574 2f696d67 2f67656e 6572616c 2f373230 78353430 2f333332 36313630 305f6b63 59303134 6474584f 41655661 3878646c 7949694a 69536744 484f5276 5f6b3044 35643063 33466468 732e6a70 671094d2 2a2b2c2d 5a24636c 6173736e 616d6558 24636c61 73736573 5556656e 7565a22e 2f555665 6e756558 4e534f62 6a656374 5f100f4e 534b6579 65644172 63686976 6572d132 3354726f 6f748001 00080011 001a0023 002d0032 0037003f 00450062 00710083 008c009b 00a300b0 00b700c5 00d000da 00e400ee 00f90105 01070109 010b010d 010f0111 01130115 01170119 011b011d 011f0121 01520154 01b901bb 01c001cb 01d401da 01dd01e3 01ec01fe 02010206 00000000 00000201 00000000 00000034 00000000 00000000 00000000 00000208>,
    )
    
    
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    _venuesInfo = [defaults objectForKey:@"mainScreenFavVenues"];
    

    像这样的应用程序更新代码后不会崩溃,但我如何将字节转换为自定义对象

    1 回复  |  直到 9 年前
        1
  •  3
  •   Amin Negm-Awad    9 年前

    保存阵列时,将保存阵列本身:

    [userData setObject:archiveArray forKey:@"mainScreenFavVenues"];
    

    当你阅读它时,你试图阅读 NSData 并解除约束:

    NSData *data = [defaults objectForKey:@"mainScreenFavVenues"];
    _venuesInfo = (NSArray *)[NSKeyedUnarchiver unarchiveObjectWithData:data];
    

    这不起作用,因为您获得了(保存的)数组的实例。取消归档发送 length 到阵列。

    只需读取阵列本身:

    NSArray *_venuesInfo = [defaults objectForKey:@"mainScreenFavVenues"];
    

    注意:当模型中有plist不支持的类实例时,您只需要archiver/unarchiver。在这种情况下,您必须向文件中写入存档版本,并使用一个非存档(unarchiver)读取它(您所做的)。然而,双方必须使用相同的技术(plist与归档)。


    要编辑:

    NSArray venuesInfoDataItems = [defaults objectForKey:@"mainScreenFavVenues"];
    NSMutableArray *_venuesInfo = [NSMutableArray new];
    for( NSData *dataItem in venuesInfoDataItems )
    {
      Venue *venue = [NSKeyedUnarchiver unarchiveObjectWithData:dataItem];
      [_venuesInfo addObject:venue];
    }
    

    在Safari中键入。