在我的 iPhone 应用程序中,我有一个名为的类Contact
,它包含一个ABRecordRef
作为对特定联系人的引用的类。
我需要将这些联系人的组存储在 中,但由于是自定义类NSUserDefaults
,因此事情进展不顺利。Contact
在这种情况下该怎么做的任何想法?
在我的 iPhone 应用程序中,我有一个名为的类Contact
,它包含一个ABRecordRef
作为对特定联系人的引用的类。
我需要将这些联系人的组存储在 中,但由于是自定义类NSUserDefaults
,因此事情进展不顺利。Contact
在这种情况下该怎么做的任何想法?
您不能NSUserDefaults
用于自定义类。从文档中:
该类
NSUserDefaults
提供了访问常见类型(如浮点数、双精度数、整数、布尔值和 URL)的便捷方法。默认对象必须是属性列表,即(或集合的实例组合)的实例:NSData
、NSString
、NSNumber
、NSDate
、NSArray
或NSDictionary
。如果要存储任何其他类型的对象,通常应将其归档以创建NSData
.
尝试使用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
协议,这一切都会起作用:
- (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
s 。id
_ ABRecordGetRecordID()
被ABRecordID
定义为 int32_t ,因此您可以将其转换为 anNSInteger
并将其存储在您喜欢的任何位置。ABAddressBookGetPersonWithRecordID()
您可以稍后从或取回记录ABAddressBookGetGroupWithRecordID()
。但是,记录可能会同时被用户或其他应用程序更改甚至删除。
将记录中的所有值复制到标准NSObject
子类中,并NSCoding
如上所述使用来存储它。当然,您将不会受益于用户可能对记录所做的更改或添加。
好吧,Apple 的建议是存储记录标识符、名字和姓氏。然后,您可以尝试通过标识符从地址簿中检索联系人,如果未找到该记录或不是正确的人,请尝试按名字和姓氏检索(因为记录标识符可能会根据您的来源而改变)地址簿数据)。
这可能是也可能不是您想要的,这取决于您存储数据的原因。但是,您可以很容易地将这三个值放入 NSDictionary 并将字典写入NSUserDefaults
.
ABRecordRef 似乎是一个const void *
,所以将它存储在 中NSUserDefaults
,你必须将它包装在NSData
:中NSData *d = [[NSData alloc] initWithBytes:thePointer length:sizeof(ABRecordRef)];
。
您可以使用转换为 vCard 表示形式(即 CFStringRef)来实际存储它,它可以很容易地用作 NSString。