0

エラーが発生しました。次のプロセスで何か問題が発生していると思います。まず、連絡先のクラスがあります。

@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(@ "got contact%@"、c);の行で、プログラムの実行が停止します。すべてが正常に印刷され、オブジェクトのクラスが「Contact」であることが印刷されます。しかし、それからそれは止まります。エラーがあるようですが、左側のエラー領域のXCode4の[スレッド別]オプションの下に疑問符が表示されています。

だから私は何が間違っているのですか?

ここに画像の説明を入力してください

4

2 に答える 2

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

2回encodeWithCoderエンコードするfirst場合は、おそらくphoneNumber2番目のエンコードが必要です。

新しいオブジェクトを作成している場所が見つからないかもしれませんが、最初に連絡先を作成するContact標準的な方法が必要になるでしょう(データまたはファイルからデコードするときにのみ初期化されると思います)。これはおそらく次のようになります。initinitWithCoder

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

他に何か問題があるかどうかはわかりませんが、これら2つのことを変更して、違いが生じるかどうかを確認してください。deallocクラスのメンバー全員を解放する場所があることを確認してください。

于 2011-07-14T18:31:14.487 に答える
0

うーん。デコードメソッドに保持を追加すると、すべてが機能することがわかりました。つまり、すべてのオブジェクトを保持します。

于 2011-07-14T18:34:36.900 に答える