首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用NSKeyedArchiver、ios读写

用NSKeyedArchiver、ios读写
EN

Stack Overflow用户
提问于 2012-07-24 17:14:16
回答 2查看 3.6K关注 0票数 1

下面是一个使用ns归档读写数据的类。

Data.m

代码语言:javascript
复制
-(id)init {
    self        =   [super init];
    if(self) {
        arr     =   [[NSMutableArray alloc] init];
    }
    return self;
}

-(NSString *)getPath {
    NSArray     *paths          =   NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString    *documentPath;

    if ([paths count] > 0)
        documentPath            =   [paths objectAtIndex:0];

    NSString *draftDataPath     =   [documentPath stringByAppendingPathComponent:@"draftData.dat"];
    return draftDataPath;
}

-(void)saveDataToDisk {
    NSString *path              =   [self getPath];
    [NSKeyedArchiver archiveRootObject:arr toFile:path];

}

-(void)loadDataFromDisk {
    NSString    *path           =   [self getPath];
    self.arr                    =   [NSKeyedUnarchiver unarchiveObjectWithFile:path];
}

稍后,我将通过执行CustomerClass.m将一些对象添加到arr

代码语言:javascript
复制
- (void) viewDidLoad {

Data *data = [[Data alloc] init];
[data.arr addObject:myObject1]
[data.arr addObject:myObject2]
[data.arr addObject:myObject3]
[data saveDataToDisk];
}

在DisplayData.m,我想通过

代码语言:javascript
复制
- (void) viewDidLoad {
   Data *data = [[Data alloc] init];
   [data loadDataFromDisk];

   NSLog(@"length of array is %d",[data.arr count]);

}

在控制台上,我得到了

代码语言:javascript
复制
length of array is 1

我觉得应该是3块。

如果你有任何线索的话,请指出我在工作中犯了什么错误。

EN

回答 2

Stack Overflow用户

发布于 2012-07-24 17:56:28

因此,我怀疑您的"myObjects“与NSCoding不兼容。我刚做了这个:

代码语言:javascript
复制
NSMutableArray *arr = [NSMutableArray arrayWithCapacity:3];
[arr addObject:@"Hello"];
[arr addObject:@" "];
[arr addObject:@"World"];
BOOL ret = [NSKeyedArchiver archiveRootObject:arr toFile:[self getPath]];

NSArray *arr2 = [NSKeyedUnarchiver unarchiveObjectWithFile:[self getPath]];
NSLog(@"count = %d", [arr2 count]);

结果是“计数= 3”

票数 5
EN

Stack Overflow用户

发布于 2012-07-24 17:31:01

我觉得这里有太多的代码来做你想要的。我想你所需要的就是:

代码语言:javascript
复制
[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:dataClass] forKey:NSUserDefaultString];
[[NSUserDefaults standardUserDefaults] synchronize];

去拯救它。

和:

代码语言:javascript
复制
NSData *someData = [[NSUserDefaults standardUserDefaults] objectForKey:NSUserDefaultString];
if (settingsData != nil)
{
    dataClass = [NSKeyedUnarchiver unarchiveObjectWithData:settingsData];
}

去取回它。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11635948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档