在我的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
获取id
的ABRecordGetRecordID()
。 ABRecordID
定义为int32_t,因此您可以将其转换为NSInteger
并将其存储在任意位置。您稍后可以从ABAddressBookGetPersonWithRecordID()
或ABAddressBookGetGroupWithRecordID()
取回记录。但是,该记录可能同时被用户或其他应用程序更改甚至删除。 NSObject
子类,并按照上面的讨论使用NSCoding
进行存储。当然,您将不会从用户可能已经做出的记录更改或添加中受益。 关于iphone - 将数据存储到NSUserDefaults,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6696558/