Вы не можете использовать 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
Reference с ABRecord
в качестве параметра.
Вы можете сделать две вещи, чтобы иметь возможность хранить информацию, на которую ссылается ABRecord
:
Получите ABRecord
s id
по ABRecordGetRecordID()
.ABRecordID
определен как int32_t, так что вы можете привести его к NSInteger
и сохранить его где угодно.Позже вы можете получить запись обратно из ABAddressBookGetPersonWithRecordID()
или ABAddressBookGetGroupWithRecordID()
.Тем не менее, запись может быть изменена или даже удалена пользователем или другим приложением.
Скопируйте все значения внутри записи в стандартный подкласс NSObject
и используйте NSCoding
, как обсуждалосьвыше, чтобы сохранить его.В этом случае вы, конечно, не получите преимуществ от изменений или дополнений в записи, которую мог сделать пользователь.