In my iPhone app, I have a class called Contact
which consists of an ABRecordRef
to serve as a reference to a particular contact.
I need to store groups of these contacts in NSUserDefaults
, but things aren't working out so well since Contact
is a custom class.
Any ideas of what to do in this case?
You cannot use
NSUserDefaults
for a custom class. From the documentation:Try using
NSData
. For example, to load custom objects into an array, you can doTo archive the data, use:
This will all work so long as your custom object complies with the
NSCoding
protocol:ABRecord
is an opaque C type, so it's not an object in the sense of Objective-C. That means you can not extend it, you can not add a category on it, you can not message it. The only thing you can do is call functions described inABRecord
Reference with theABRecord
as a parameter.You could do two things to be able to keep the information referenced by the
ABRecord
around:Get the
ABRecord
sid
byABRecordGetRecordID()
. TheABRecordID
is defined as int32_t so you can cast it to anNSInteger
and store it wherever you like. You can later get the record back fromABAddressBookGetPersonWithRecordID()
orABAddressBookGetGroupWithRecordID()
. However, the record could be changed or even deleted by the user or another app meanwhile.Copy all values inside the record to a standard
NSObject
subclass and useNSCoding
as discussed above to store it. You will then, of course, not benefit from changes or additions to the record the user could have made.You can store it actually using conversion to vCard representation, which is CFStringRef, that can be easily used as NSString.
Well, Apple's recommendation is to store the record identifier, the first name, and the last name. You can then try retrieving the contact from the address book by the identifier and, if the record isn't found or if it's not the right person, try retrieving by first and last name (since record identifiers may change depending on the source of your address book data).
This may or may not be what you want, depending on why you're storing the data. But, you could pretty easily put those three values into an NSDictionary and write the dictionary to
NSUserDefaults
.ABRecordRef appears to be a
const void *
, so store it inNSUserDefaults
, you have to wrap it inNSData
:NSData *d = [[NSData alloc] initWithBytes:thePointer length:sizeof(ABRecordRef)];
.