如何在包含更多自定义对象的数组中保存自定义对象

时间:2013-11-03 21:54:34

标签: ios objective-c nsarray nsdata

我有一个像这样分解的数组:

PersonArray
    PersonObject
       1. NSstring (personsName)
       2. NSMutableArray (EventsObject)

我可以使用以下代码保存此数组:

NSMutableArray *archiveArray = [NSMutableArray arrayWithCapacity:mutableDataArray.count];
for (BC_Person *personObject in mutableDataArray)
{
    NSData *personEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:personObject];
    [archiveArray addObject:personEncodedObject];
}

NSUserDefaults *userData = [NSUserDefaults standardUserDefaults];
[userData setObject:archiveArray forKey:@"personDataArray"];
[userData synchronize];

我坚持的是:如果我将对象添加到NSMutableArray对象内的Person,我是否还必须将该对象数组(EventsObject)转换为NSData

(我想我会这么做,但我似乎无法弄清楚如何定位该对象数组(EventsObject)以在PersonArray内进行转换。

我希望我能以一种易于理解的方式解释这一点。

1 个答案:

答案 0 :(得分:0)

NSArray和其他一些类实现了NSCoding协议。因此,您可以将代码简化为:

NSData *personData = [NSKeyedArchiver archivedDataWithRootObject:mutableDataArray];
NSUserDefaults *userData = [NSUserDefaults standardUserDefaults];
[userData setObject:personData forKey:@"personDataArray"];
[userData synchronize];

对于要归档的任何对象,您实施NSCoding协议。所以对于BC_Person它可能看起来像这样(我不知道这个类,所以我以一些属性为例):

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

    [encoder encodeObject:self.firstName forKey:@"firstName"];
    [encoder encodeObject:self.lastName forKey:@"lastName"];
    [encoder encodeObject:self.eventObjects forKey:@"eventObjects"];
}

在此示例中,self.eventObjects将是EventsObject类的对象数组。数组知道如何编码自己,而对于EventsObject,你实现了另一个-encodeWithCoder:方法。

要取消归档,你就可以改变这个过程。