NSCoding的存储

NSUserDefaults只支持:NSString,NSNumber,NSData,NSArray,NSDictionary;
所以我们要把一个自定义的类存到NSArray中,然后存到NSUserDefaults里也是不能存成功的。因为文档说了,存储在NSArray和NSDictionary中的内容必须是 Property List 属性。

所以我们用NSCoding。

我找到的方法是,让这个自定义类实现<NSCoding>协议中的 - (id) initWithCoder: (NSCoder *)coder//序列化对象的时候,这个方法会自动调用,完成本对象具体属性的编码工作。

- (void) encodeWithCoder: (NSCoder *)coder//反序列化的时候自动调用。

我们有一个简单的类实现这两个协议:

=========h文件

#import <Foundation/Foundation.h>

#define    kField1Key    @"Field1"
#define    kField2Key    @"Field2"
#define    kField3Key    @"Field3"
#define    kField4Key    @"Field4"
#define    kField5Key    @"m"

//本对象必须要实现NSCoding协议

@interface FourLines : NSObject <NSCoding> {
    NSString *field1;
    NSString *field2;
    NSString *field3;
    NSString *field4; 
    int m;
     float n;
}

@property(nonatomic,assign)int m;
@property (nonatomic, retain) NSString *field1;
@property (nonatomic, retain) NSString *field2;
@property (nonatomic, retain) NSString *field3;
@property (nonatomic, retain) NSString *field4;
@end

=============.m文件

#import "FourLines.h"
@implementation FourLines
@synthesize field1;
@synthesize field2;
@synthesize field3;
@synthesize field4;
@synthesize m;

#pragma mark NSCoding

//序列化本对象的时候,encodeWithCoder会自动调用
//完成本对象具体属性的编码工作
- (void)encodeWithCoder:(NSCoder *)encoder {
     NSLog(@"encodeWithCoder");

//编码本对象中具体的属性值,对每一个属性要指定不同键

[encoder encodeObject:field1 forKey:kField1Key];

    [encoder encodeObject:field2 forKey:kField2Key];

    [encoder encodeObject:field3 forKey:kField3Key];

    [encoder encodeObject:field4 forKey:kField4Key];

[encoder encodeInt:m forKey:kField5Key];

}


//反序列化时候被自动调用

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

    if (self = [super init]) {

        self.field1 = [decoder decodeObjectForKey:kField1Key];

        self.field2 = [decoder decodeObjectForKey:kField2Key];

        self.field3 = [decoder decodeObjectForKey:kField3Key];

        self.field4 = [decoder decodeObjectForKey:kField4Key];

self.m=[decoder decodeIntForKey:kField5Key];

    }

    return self;

}
@end

我们在使用的时候就可以这样用:

//先创建一个空对象
FourLines *fourLines = [[FourLines alloc] init];
//把数据赋值给对象里的属性
fourLines.field1 = textField1.text;
fourLines.field2 = textField2.text;
fourLines.field3 = textField3.text;
fourLines.field4 = textField4.text;
//然后可以把这个对象转化称NSData的类型 就可以进行任何存储了(NSUserDefaults 写入文件等等)。

NSData *object = [NSKeyedArchiver archivedDataWithRootObject:fourLines];
取的时候就用
fourLines = [NSKeyedUnarchiver unarchiveObjectWithData:object] ;  
写入文件:

//创建一个可变NSData,没有内容

NSMutableData *data = [[NSMutableData alloc] init];

//创建文档对象,以可变nsdata为参数,用这个方法必须实现finishEncoding方法。

NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];

//利用文档 把这个对象先写到那个可变nsdata

[archiver encodeObject:fourLines forKey:kDataKey];

[archiver finishEncoding];
取的时候就用:

- (id)decodeObjectForKey:(NSString *)key;



你可能感兴趣的:(对象序列化,NSCoding)