5

我有一个名为 Occasion 的自定义对象,定义如下:

#import <Foundation/Foundation.h>


@interface Occasion : NSObject {

NSString *_title;
NSDate *_date;
NSString *_imagePath;    

}

@property (nonatomic, retain) NSString *title;
@property (nonatomic, retain) NSDate *date;
@property (nonatomic, retain) NSString *imagePath;

现在我有一个 NSMutableArray 的场合,我想保存到 NSUserDefaults。我知道这是不可能的,所以我想知道哪种方法最简单?如果序列化是答案,那么如何?因为我阅读了文档但无法完全理解它的工作方式。

4

3 回答 3

11

您应该使用类似NSKeyedArchiver的方法将数组序列化为NSData,将其保存到NSUserDefaults,然后用于NSKeyedUnarchiver稍后反序列化:

NSData *serialized = [NSKeyedArchiver archivedDataWithRootObject:myArray];
[[NSUserDefaults standardUserDefaults] setObject:serialized forKey:@"myKey"];

//...

NSData *serialized = [[NSUserDefaults standardUserDefaults] objectForKey:@"myKey"];
NSArray *myArray = [NSKeyedUnarchiver unarchiveObjectWithData:serialized];

您将需要NSCoding在您的类中实现协议Occasion并正确保存各种属性以使其正常工作。有关详细信息,请参阅存档和序列化编程指南。执行此操作不应该超过几行代码。就像是:

- (void)encodeWithCoder:(NSCoder *)coder {
    [super encodeWithCoder:coder];

    [coder encodeObject:_title forKey:@"_title"];
    [coder encodeObject:_date forKey:@"_date"];
    [coder encodeObject:_imagePath forKey:@"_imagePath"];
}

- (id)initWithCoder:(NSCoder *)coder {
    self = [super initWithCoder:coder];

    _title = [[coder decodeObjectForKey:@"_title"] retain];
    _date = [[coder decodeObjectForKey:@"_date"] retain];
    _imagePath = [[coder decodeObjectForKey:@"_imagePath"] retain];

    return self;
}
于 2011-10-12T16:45:24.790 回答
4

NSUserDefaults旨在满足用户偏好,而不是存储应用程序数据。使用CoreData或将对象序列化到文档目录中。你需要让你的类实现NSCoding协议才能工作。

1)NSCoding实施Occasion.h

@interface Occasion : NSObject <NSCoding>

2) 实现协议Occasion.m

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

    if (self = [super init]) {

        self.title = [aDecoder decodeObjectForKey:@"title"];
        self.date = [aDecoder decodeObjectForKey:@"date"];
        self.imagePath = [aDecoder decodeObjectForKey:@"imagePath"];

    }            
    return self;
}

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

    [aCoder encodeObject:title forKey:@"title"];
    [aCoder encodeObject:date forKey:@"date"];
    [aCoder encodeObject:imagePath forKey:@"imagePath"];
}

3) 将数据归档到文档目录中的文件中

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                    NSUserDomainMask, YES);
NSString *documentsPath = [paths objectAtIndex:0];
NSString *path= [documentsPath stringByAppendingPathComponent:@“occasions”];
[NSKeyedArchiver archiveRootObject:occasions toFile:path];

4) 取消归档...

NSMutableArray *occasions = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
于 2011-10-12T16:58:41.807 回答
1

您可以NSCodingOccasion.

然后,您可以使用从数组[NSKeyedArchiver archivedDataWithRootObject:myArray]中创建一个对象。NSData您可以将其放入用户默认值中。

于 2011-10-12T16:47:24.977 回答