gpt4 book ai didi

iphone - 将数据存储到 NSUserDefaults

转载 作者:技术小花猫 更新时间:2023-10-29 10:42:25 25 4
gpt4 key购买 nike

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

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

在这种情况下有什么想法吗?

最佳答案

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

The NSUserDefaults class provides convenience methods for accessing common types such as floats, doubles, integers, Booleans, and URLs. A default object must be a property list, that is, an instance of (or for collections a combination of instances of): NSData, NSString, NSNumber, NSDate, NSArray, or NSDictionary. If you want to store any other type of object, you should typically archive it to create an instance of 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 协议(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 引用的信息:

  1. 通过ABRecordGetRecordID()获取ABRecordidABRecordID 定义为 int32_t,因此您可以将其转换为 NSInteger 并将其存储在您喜欢的任何位置。您稍后可以从 ABAddressBookGetPersonWithRecordID()ABAddressBookGetGroupWithRecordID() 取回记录。但是,记录可能会被用户或其他应用同时更改甚至删除。

  2. 将记录中的所有值复制到标准 NSObject 子类,并使用 NSCoding 如上所述进行存储。当然,您将无法从用户可能做出的记录更改或添加中获益。

关于iphone - 将数据存储到 NSUserDefaults,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6696558/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com