No puede usar NSUserDefaults
para una clase personalizada. A partir de la documentación:
El NSUserDefaults
clase proporciona métodos de conveniencia para acceder tipos comunes tales como flotadores, dobles, números enteros, booleanos y URL. Un objeto predeterminado debe ser una lista de propiedades, es decir, una instancia de (o para las colecciones de una combinación de las instancias de): NSData
, NSString
, NSNumber
, NSDate
, NSArray
, o NSDictionary
. Si desea almacenar cualquier otro tipo de objeto , normalmente debe archivarlo para crear una instancia de NSData
.
Probar usando NSData
. Por ejemplo, la carga de objetos personalizados en una matriz, que puede hacer
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];
}
Para archivar los datos, utilice:
[[NSUserDefaults standardUserDefaults] setObject:[NSKeyedArchiver archivedDataWithRootObject:objectArray] forKey:@"savedArray"];
Esto hará todo el trabajo, siempre y cuando el objeto personalizado cumple con el protocolo 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
es un tipo C opaco, por lo que no es un objeto en el sentido de Objective-C. Eso significa que no puede ampliarlo, no puede agregar una categoría, no puede enviarlo por mensaje. Lo único que puede hacer es llamar a las funciones descritas en ABRecord
Referencia con ABRecord
como parámetro.
Se podía hacer dos cosas para ser capaz de mantener la información que hace referencia la ABRecord
en torno a:
Consigue el ABRecord
s id
por ABRecordGetRecordID()
. El ABRecordID
se define como int32_t para que pueda convertirlo a NSInteger
y almacenarlo donde desee. Luego puede recuperar la grabación desde ABAddressBookGetPersonWithRecordID()
o ABAddressBookGetGroupWithRecordID()
. Sin embargo, el registro podría ser modificado o incluso borrado por el usuario o por otra aplicación mientras tanto.
Copie todos los valores dentro del registro en una subclase estándar NSObject
y utilice NSCoding
como se indicó anteriormente para almacenarlo. Por supuesto, no se beneficiará de los cambios o adiciones al registro que el usuario podría haber realizado.
Pero no puedo codificar ABRecordRef porque aparentemente no es un objeto. – CodeGuy
bien, hice todo eso. pero ¿cómo codifico ABRecordRef – CodeGuy
@ reising1: ver arriba. – PengOne