0

我正在尝试使用 NSUSerDefault 保存 NSMutableArray,然后打开该数组。这里有一些代码:

-(IBAction)btnSave{    
Class *aClass = [[Class alloc]init];    
aClass.idClass=@"aaaxxx";    
aClass.nameClass=@"hello";
[myArray addObject:aClass];
NSUserDefaults *arrayDefault=[NSUserDefaults standardUserDefaults];
[arrayDefault setObject:myArray forKey:@"savedArray"];
[arrayDefault synchronize]; 
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    myArray=[[NSMutableArray alloc]init];

    NSMutableArray *savedArray=[[NSUserDefaults standardUserDefaults]objectForKey:@"savedArray"];
    if(savedArray!=NULL){
        myArray=savedArray;
        [tableView reloadData];
    }
    // Do any additional setup after loading the view from its nib.
}

当我编译并按下按钮时,这是我在日志输出中看到的内容:

[NSUserDefaults setObject:forKey:]: Attempt to insert non-property value '(
    "<Class: 0x8452b40>"
)' of class '__NSArrayM'.  Note that dictionaries and arrays in property lists must also contain only property values

显然,当我重新打开视图时,未加载数组。有什么帮助吗?

4

3 回答 3

3

NSUserDefaults只允许将 Premitive DataTypes 存储在其中。如果您想存储您的自定义类对象,请使用以下代码,有关更多详细信息,请参阅此IOS 文档

//create an array with your custom class objects

Class *aClass = [[Class alloc]init];
aClass.idClass=@"aaaxxx";
aClass.nameClass=@"hello";

[myArray addObject:aClass];

//convert your array to `NSData` object using `NSKeyedArchiver`    
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:myArray];

//store it to `NSUserDefaults`
[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"myArray"];
[[NSUserDefaults standardUserDefaults] synchronize];

//convert your stored Object back to `NSData` using `NSKeyedUnarchiver`    
NSData *storedData = [[NSUserDefaults standardUserDefaults] objectForKey:@"myArray"];
NSArray *storedArr = [NSArray arrayWithArray:[NSKeyedUnarchiver unarchiveObjectWithData:storedData]];

NSLog(@"%@",storedArr[0]);
于 2013-05-13T10:19:23.167 回答
0

首先,您在对象类中实现 NSCoding。为了保存/加载这些对象的 NSMutableArray,您可以执行以下操作:

- (void) loadArray {
    //Loading the NSMutableArray
    NSData *arrayData = [[NSUserDefaults standardUserDefaults] objectForKey:@"ArrayKey"];
    myArray = [NSKeyedUnarchiver arrayData];
}

-(void) saveArray {
    //Saving the NSMutableArray
    NSData *arrayData = [NSKeyedArchiver archivedDataWithRootObject:myArray];
    [[NSUserDefaults standardUserDefaults] setObject:arrayData forKey:@"ArrayKey"];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

有关更多信息,我建议查看更长的教程。例如,Ray Wenderlich 的How to Save your App Data with NSCoding And NSFileManager是一篇不错的文章。

于 2013-05-13T10:20:38.140 回答
0

您需要在模型对象中实现 NSCoding 协议Class。需要将非标准数据序列化和反序列化为NSUserDefaults.

现在您可以使用NSKeyedArchiver将对象转换为数据并存储在 userDefaults 中。用于NSKeyedUnarchiver将数据从默认值转换回对象。

//h file
@interface Class : NSObject<NSCoding>

@property (nonatomic, copy) NSString *idClass;
@property (nonatomic, copy) NSString *nameClass;


//m File

- (void)encodeWithCoder:(NSCoder *)aCoder{

    [aCoder encodeObject:self.idClass forKey:@"IDClass"];
    [aCoder encodeObject:self.nameClass forKey:@"NameClass"];

}

- (id)initWithCoder:(NSCoder *)aDecoder{

    self = [super init];

    if (self) {
        self.idClass = [aDecoder decodeObjectForKey:@"IDClass"];
        self.nameClass = [aDecoder decodeObjectForKey:@"NameClass"];
    }

    return self;
}

实施 NSCoding 后,您可以将它们归档以存储为 userDefaults 中的数据

//Saving array
Class *aClass = [[Class alloc]init];    
aClass.idClass=@"aaaxxx";    
aClass.nameClass=@"hello";

[myArray addObject:aClass];

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:myArray];

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:data forKey:@"savedArray"];
[defaults synchronize]; 

//Retrieving 

NSData *data = [defaults objectForKey:@"savedArray"];
NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:data];
于 2013-05-13T10:07:21.933 回答