2011-07-14 50 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