我遇到了错误,我猜我在以下过程中做错了。首先,我有一个班级联系人:
@interface Contact : NSObject<NSCoding> {
@private
ABRecordRef ref;
NSString *first;
NSString *last;
bool selected;
NSString *phoneNumber;
}
在Contact的实现中,我有:
- (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(@“get contact%@”,c);行上,我的程序停止运行。它打印一切都很好,甚至打印对象的类是“联系”。但随后就停止了。看起来可能有错误,但在左侧我只是在左侧错误区域的XCode 4中的“按线程”选项下看到问号。
那么我做错了什么?
答案 0 :(得分: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
释放所有班级成员。
答案 1 :(得分:0)
嗯。原来如果我在解码方法上添加了一个保留,一切正常。我的意思是,保留所有对象。