// **加载数组部分

  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字节]:

注意:_venuesInfo自定义对象我得到了场所对象和该对象
encodeWithCoderinitWithCoder
另外,当我调试加载部分时,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"];

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

最佳答案

保存数组时,将保存数组本身:

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

读取时,您尝试读取NSData的实例并取消存档:
NSData *data = [defaults objectForKey:@"mainScreenFavVenues"];
_venuesInfo = (NSArray *)[NSKeyedUnarchiver unarchiveObjectWithData:data];

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

只需阅读数组本身即可:
NSArray *_venuesInfo = [defaults objectForKey:@"mainScreenFavVenues"];

注意:如果模型中存在plists不支持的类的实例,则仅需要一个存档器/取消存档器。在这种情况下,您必须将存档版本写入文件,然后使用解存档器读取它(您要执行的操作)。但是,双方都必须使用相同的技术(plist与存档)。

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

在Safari中输入。

关于ios - NSData到NSArray给出如下错误:'-[__ NSCFArray bytes]:,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32375035/

10-13 06:23