在我的iPhone应用程序中,我有一个名为Contact的类,该类由ABRecordRef组成,可以用作对特定联系人的引用。

我需要将这些联系人的组存储在NSUserDefaults中,但是由于Contact是一个自定义类,因此效果不佳。

在这种情况下该怎么办?

最佳答案

您不能将NSUserDefaults用于自定义类。从文档中:



尝试使用NSData。例如,要将自定义对象加载到数组中,您可以执行

NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
NSData *dataRepresentingSavedArray = [currentDefaults objectForKey:@"savedArray"];
if (dataRepresentingSavedArray != nil)
{
        NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSavedArray];
        if (oldSavedArray != nil)
                objectArray = [[NSMutableArray alloc] initWithArray:oldSavedArray];
        else
                objectArray = [[NSMutableArray alloc] init];
}

要存档数据,请使用:
[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:objectArray] forKey:@"savedArray"];

只要您的自定义对象符合NSCoding协议(protocol),这一切都将起作用:
- (void)encodeWithCoder:(NSCoder *)coder;
{
    [coder encodeObject:label forKey:@"label"];
    [coder encodeInteger:numberID forKey:@"numberID"];
}

- (id)initWithCoder:(NSCoder *)coder;
{
    self = [[CustomObject alloc] init];
    if (self != nil)
    {
        label = [coder decodeObjectForKey:@"label"];
        numberID = [coder decodeIntegerForKey:@"numberID"];
    }
    return self;
}
ABRecord是不透明的C类型,因此它不是Objective-C的对象。这意味着您无法扩展它,无法在其上添加类别,也无法向其发送消息。唯一可以做的就是调用ABRecord引用中描述的函数,并将ABRecord作为参数。

您可以做两件事以使ABRecord所引用的信息保持不变:
  • 通过ABRecord获取idABRecordGetRecordID()ABRecordID定义为int32_t,因此您可以将其转换为NSInteger并将其存储在任意位置。您稍后可以从ABAddressBookGetPersonWithRecordID()ABAddressBookGetGroupWithRecordID()取回记录。但是,该记录可能同时被用户或其他应用程序更改甚至删除。
  • 将记录内的所有值复制到标准NSObject子类,并按照上面的讨论使用NSCoding进行存储。当然,您将不会从用户可能已经做出的记录更改或添加中受益。
  • 关于iphone - 将数据存储到NSUserDefaults,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6696558/

    10-09 13:02