一组自定义对象的文件存取方法

    技术2025-08-28  12

    转载请注明此处:http://blog.csdn.net/jimney_ljj/archive/2011/02/15/6185480.aspx

           在ios游戏和应用的开发过程中,我们需要将一些数据保存到文件中,记录当前的一些状态或者数据信息。在cocoatouch库中,NSData、NSString、NSArray及NSDictory有相应的读写方法。当NSArray、NSDictory存放的是NSString或者NSData对象数据,那么可以直接使用NSArray、NSDictory的writeToFile方法,如果NSArray、NSDictory存放的自定类对象,就不可以直接使用此方法了。

           cocoatouch库为我们提供的实现存储自定义对象的方式,通过在自定义类中实现NSCoding代理方法,使用时通过NSKeyedArchiver 类方法可将自定义类对象转化成NSData对象,保存到数组中然后一起写入文件。

     

    首先在在自定义类中实现NSCoding的代理方法,对类成员进行编码与解码,代码简要实现如下:

    @interface CustomObject:NSObject<NSCoding> int nValue; BOOL bValue; @end 

     

    #define INT_VALUE_KEY @"int" #define BOOL_VALUE_KEY @"bool" @implementation CustomObject #pragma init & dealloc - (id)initWith......{ if((self = [super init])){ // todo init: } return self; } - (void)dealloc{ [super dealloc]; } #pragma NSCoding delegate - (void)encodeWithCoder:(NSCoder *)aCoder { [aCoder encodeInt:nValue forKey:INT_VALUE_KEY]; [aCoder encodeBool:bValue forKey:BOOL_VALID_KEY]; } - (id)initWithCoder:(NSCoder *)aDecoder{ if (self = [super init]){ nValue = [aDecoder decodeIntForKey:INT_VALUE_KEY]; bValue = [aDecoder decodeBoolForKey:BOOL_VALID_KEY]; } return self; } @end 

     

    使用时通过NSKeyedArchiver 进行对象数据转换,实现过程如下:

    a.写入文件过程:

    1、将自定义对象转化成NSData对象,添加到NSArray中

    2、NSArray通过writeToFile方法写入到文件中

     

     

    NSMutableArray *aArray = [[NSMutableArray alloc] init]; CustomObject *aObject = [[CustomObject alloc] initWith......]; //对数据进行编码,转成NSData数据,存入数组中 NSData* aDate = [NSKeyedArchiver archivedDataWithRootObject:aObject]; [aArray addObject:aDate]; [aObject release];  

     

    b.读取文件过程:

    1、将文件中的数据读入到NSArray中

    2、将NSData对象一次转化为自定义对象

    NSMutableArray* aArray = [NSMutableArray arrayWithContentsOfFile:readpath]; NSData* aData = [aArray objectAtIndex:i]; CustomObject* aObject = [NSKeyedUnarchiver unarchiveObjectWithData:aData];  

     

    总结

    通过直接保存程序中的对象信息,更加方便我们在开发过程中进行数据存取。很多时候直接保存文本信息,需要我们额外的数据解析,借助于这个方法得实现,直接将对象数据信息保存为xml格式的信息文件,存取更加灵活。

     

    最新回复(0)