为了账号安全,请及时绑定邮箱和手机立即绑定

在NSUserDefault中将自定义对象存储在NSMutableArray中

在NSUserDefault中将自定义对象存储在NSMutableArray中

万千封印 2019-07-12 19:08:31
在NSUserDefault中将自定义对象存储在NSMutableArray中我最近一直在尝试将我的iPhone应用程序的搜索结果存储在NSUserDefaults集合中。我还使用它成功地保存了用户注册信息,但出于某种原因,试图存储我的自定义位置类的NSMutableArray始终是空的。在本文中,我尝试将NSMutableArray转换为NSData元素,但得到了相同的结果(是否可以在iPhone上使用NSUserDefault保存整数数组?)我尝试过的代码示例如下:保留:[prefs setObject:results forKey:@"lastResults"];[prefs synchronize];或NSData *data = [NSData dataWithBytes:&results length:sizeof(results)];[prefs setObject:data forKey:@"lastResults"];或NSData *data = [NSKeyedArchiver archivedDataWithRootObject:results];[prefs setObject:data forKey:@"lastResults"];负载:lastResults = (NSMutableArray *)[prefs objectForKey:@"lastResults"];或NSData *data = [prefs objectForKey:@"lastResults"];memcpy(&lastResults, data.bytes, data.length);或NSData *data = [prefs objectForKey:@"lastResults"];lastResults = [NSKeyedUnarchiver unarchiveObjectWithData:data];在以下建议之后,我还在我的对象中实现了NSCoder(忽略对NSString临时的过度使用):#import "Location.h"@implementation Location@synthesize locationId;@synthesize companyName;@synthesize addressLine1; @synthesize addressLine2;@synthesize city;@synthesize postcode;@synthesize telephoneNumber;@synthesize description; @synthesize rating;@synthesize priceGuide;@synthesize latitude;@synthesize longitude;@synthesize userLatitude; @synthesize userLongitude;@synthesize searchType;@synthesize searchId; @synthesize distance;@synthesize applicationProviderId;@synthesize contentProviderId;- (id) initWithCoder: (NSCoder *)coder{     if (self = [super init])     {         self.locationId = [coder decodeObjectForKey:@"locationId"];         self.companyName = [coder decodeObjectForKey:@"companyName"];         self.addressLine1 = [coder decodeObjectForKey:@"addressLine1"];         self.addressLine2 = [coder decodeObjectForKey:@"addressLine2"];         self.city = [coder decodeObjectForKey:@"city"];         self.postcode = [coder decodeObjectForKey:@"postcode"];         self.telephoneNumber = [coder decodeObjectForKey:@"telephoneNumber"];         self.description = [coder decodeObjectForKey:@"description"];
查看完整描述

3 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

为了将自定义对象加载到数组中,这是我用来获取数组的方法:

NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
NSData *dataRepresentingSavedArray = [currentDefaults objectForKey:@"savedArray"];if (dataRepresentingSavedArray != nil){
    NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSavedArray];
    if (oldSavedArray != nil)
        objectArray = [[NSMutableArray alloc] initWithArray:oldSavedArray];
    else
        objectArray = [[NSMutableArray alloc] init];}

您应该检查从用户默认值返回的数据是否为零,因为我认为从无存档会导致崩溃。

使用以下代码进行归档很简单:

[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:objectArray] forKey:@"savedArray"];

正如f3lix所指出的,您需要使您的自定义对象符合NSCoding协议。添加像下面这样的方法应该可以做到这一点:

- (void)encodeWithCoder:(NSCoder *)coder;{
    [coder encodeObject:label forKey:@"label"];
    [coder encodeInteger:numberID forKey:@"numberID"];}- (id)initWithCoder:(NSCoder *)coder;{
    self = [super init];
    if (self != nil)
    {
        label = [[coder decodeObjectForKey:@"label"] retain];
        numberID = [[coder decodeIntegerForKey:@"numberID"] retain];
    }   
    return self;}


查看完整回答
反对 回复 2019-07-12
?
叮当猫咪

TA贡献1776条经验 获得超12个赞

我认为您的代码的问题不在于保存结果数组。它加载数据时尝试使用

lastResults = [prefs arrayForKey:@"lastResults"];

这将返回键指定的数组。


查看完整回答
反对 回复 2019-07-12
  • 3 回答
  • 0 关注
  • 683 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信