2011-07-14 4 views
0

J'ai une erreur et je suppose que je fais quelque chose de mal dans le processus suivant. Tout d'abord, j'ai une classe Contacts:NSUserDefaults, NSCoder, Custom Class - Application iPhone question

@interface Contact : NSObject<NSCoding> { 
    @private 
    ABRecordRef ref; 
    NSString *first; 
    NSString *last; 
    bool selected; 
    NSString *phoneNumber; 
} 

Et dans la mise en œuvre de contact, je:

- (void)encodeWithCoder:(NSCoder *)encoder { 
    [encoder encodeObject:first forKey:@"First"]; 
    [encoder encodeObject:last forKey:@"Last"]; 
    [encoder encodeObject:[NSNumber numberWithInteger: ABRecordGetRecordID(ref)] forKey:@"Ref" ]; 
    [encoder encodeObject:first forKey:@"PhoneNumber"]; 
} 

- (id)initWithCoder:(NSCoder *)decoder { 
    self = [[Contact alloc] init]; 
    first = [decoder decodeObjectForKey:@"First"]; 
    last = [decoder decodeObjectForKey:@"Last"]; 
    ABAddressBookRef addressBook = ABAddressBookCreate(); 
    NSNumber *num = [decoder decodeObjectForKey:@"Ref"]; 
    ref = ABAddressBookGetPersonWithRecordID(addressBook,(ABRecordID)num); 
    phoneNumber = [decoder decodeObjectForKey:@"PhoneNumber"]; 

    return self; 
} 

Et quand je crée ce que j'appelle un « groupe » dans mon application, je fais ce qui suit: Ce qui, selon certaines déclarations d'impression, semble fonctionner correctement.

Ensuite, lorsque l'application lance, je tente d'imprimer ces objets que je stockés:

+ (void)printGroups { 
    NSMutableArray *arr = [UserData getGroupNames]; 
    NSLog(@"group names are %@",arr); 
    for(int i = 0; i < [arr count]; i++) { 
     NSString *name = [arr objectAtIndex:i]; 
     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
     NSData *data = [defaults objectForKey:name]; 
     NSArray *a = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 
     NSLog(@"name = %@",name); 
     NSLog(@"array count is %i",[a count]); 
     for(int i = 0; i < [a count]; i++) { 
      NSLog(@"on index %i",i); 
      Contact *c = [a objectAtIndex:i]; 
      NSLog(@"got contact"); 
      if(c == nil) 
       NSLog(@"it's nil!");  

      NSLog(@"class is %@", NSStringFromClass([c class])); 
      NSLog(@"got contact %@",c); 
     } 
     NSLog(@"array = %@",a); 
    } 
} 

Cependant, sur la ligne NSLog (@ "a obtenu le contact% @", c) ;, arrête mon programme en cours d'exécution . Il imprime tout bien, et imprime même que la classe de l'objet est "Contact". Mais alors ça s'arrête. Il semble qu'il y ait peut-être une erreur mais sur le côté gauche je vois juste des points d'interrogation sous l'option "By Thread" dans XCode 4 dans la zone d'erreur sur la gauche.

Alors qu'est-ce que je fais mal?

enter image description here

Répondre

0

D'abord, init devrait ressembler à ceci:

- (id)initWithCoder:(NSCoder *)decoder 
{ 
    if(self = [super init]) 
    { 
     first = [[decoder decodeObjectForKey:@"First"] retain]; 
     last = [[decoder decodeObjectForKey:@"Last"] retain]; 
     ABAddressBookRef addressBook = ABAddressBookCreate(); 
     NSNumber *num = [decoder decodeObjectForKey:@"Ref"]; 
     ref = ABAddressBookGetPersonWithRecordID(addressBook,(ABRecordID)num); 
     phoneNumber = [[decoder decodeObjectForKey:@"PhoneNumber"] retain]; 
    } 

    return self; 
} 

En encodeWithCoder vous encodez first deux fois, vous avez probablement voulu phoneNumber dans le second.

Peut-être que je suis absent où vous créez de nouveaux objets Contact, mais vous voudrez probablement une méthode init standard pour créer le contact initialement (initWithCoder Initialise uniquement lorsque vous décodage de données ou un fichier, je crois) . Cela voudrait probablement ressembler à quelque chose comme:

- (id)initWithFirst:(NSString *)firstIn last:(NSString *)lastIn phone:(NSString *)phoneIn 
{ 
    if(self = [super init]) 
    { 
     first = [firstIn retain]; 
     last = [lastIn retain]; 
     phoneNumber = [phoneIn retain]; 
     selected = NO; 
     ref = //however you generate a record reference 
    } 

    return self; 
} 

Je ne sais pas si quoi que ce soit d'autre ne va pas, mais essayez de changer ces deux choses et voir si cela fait une différence. Assurez-vous d'avoir un dealloc où vous libérez tous les membres de votre classe.

0

Hm. Il s'est avéré que si j'ai ajouté une retenue sur la méthode de décodage, tout a fonctionné. Je veux dire, conserver tous les objets.

+0

chercher NSZombie, il peut vous aider à trouver ces problèmes – bshirley