2011-07-14 126 views
0

我有一个错误,我想我在以下过程中做错了什么。首先,我有一个类隐形眼镜:NSUserDefaults,NSCoder,自定义类 - iPhone应用程序问题

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

并接触的实现,我有:

- (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; 
} 

当我创造什么我在我的应用程序调用一个“组”,我做到以下几点:

+ (void)addGroupWithName:(NSString *)s contacts:(NSMutableArray *)arr { 
    NSLog(@"added group name with name %@",s); 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:arr]; 
    [defaults setObject:data forKey:s]; 
    [defaults synchronize]; 
    //[UserData setDefaultWithName:s object:arr]; 
} 

其中,根据我制作的一些打印声明,似乎工作正常。

然后,当应用程序启动,我尝试打印这些对象存储我:

+ (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); 
    } 
} 

然而,上线的NSLog(@ “有联系%@”,C);,我的程序停止运行。它打印一切正常,甚至打印该对象的类是“联系”。但随后停止。它看起来也许有一个错误,但在左侧,我只看到在左边的错误区域XCode 4中的“按线程”选项下的问号。

那么我做错了什么?

enter image description here

回答

0

首先,你的init应该是这样的:

- (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; 
} 

encodeWithCoder你编码first两次,你可能在第二个想phoneNumber

也许我失去了在那里你创建新Contact对象,但你可能会希望有一个标准init方法最初创建的接触(仅initWithCoder当你从数据或文件解码初始化,我相信) 。这可能要看起来像:

- (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; 
} 

我不知道别的是错误的,但尝试改变这两个东西,看看它是否有差别。确保你有一个dealloc你释放你所有的班级成员。

0

嗯。原来,如果我在解码方法上添加了保留,一切都奏效了。我的意思是,保留所有的对象。

+0

查找NSZombie,它可以帮助你找到这些问题 – bshirley