ios - NSData 到 NSArray 给出错误,原因如下 : '-[__NSCFArray bytes]:

标签 ios objective-c nsarray nsuserdefaults nsdata

//** 加载数组部分

  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 给我这个错误;

ERROR : *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFArray bytes]:

NOTE : _venuesInfo custom object i got venue object and this object have got encodeWithCoder and 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"];

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

最佳答案

保存数组时,您也保存了数组本身:

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

当您阅读它时,您会尝试读取 NSData 的实例并取消存档:

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

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

只需读取数组本身:

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

注意:当模型中存在 plist 不支持的类实例时,您只需要归档器/解归档器。在这种情况下,您必须将存档版本写入文件并使用解档器读取它(您所做的)。然而,双方必须使用相同的技术(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/

相关文章:

ios - Nuance Vocalizer 演示应用程序无法为 64 位模拟器设备构建

ios - 使用带有浮点值的 dispatch_time

ios - 使用 NSDictionary Objective C(用于登录)检查 TextField 中的值

ios - 当我添加到字典后从数组中删除值时。数组值从 iOS 中的字典中删除?

iphone - 使用NSPredicate过滤NSArray

ios - "Type ' 任务。在 Swift 中键入 ' has no subscript members"错误

ios - 如何实现两个 Storyboard? ios

IOS 相当于 Android 选择器

ios - 添加其他对象到 NSArray

ios - 如何在每个午夜在 ios (Objective-C) 上获取和更新数据?