NSKeyedUnarchiverオブジェクトが壊れてばかり?
-
19-09-2019 - |
質問
私は、NSUserDefaultsに保存するNSCodingプロトコルに準拠した私のカスタムクラスの割り当て、の配列を含むてる配列を持っています。アレイは保存し、ロード正しく、そしてIは、配列の取得第1の目的は、クラス割り当てであることを検証することができます。私は、配列に割り当てオブジェクトのアイバーズにアクセスしようとすると問題が起こります。それがクラッシュし、私は次のエラーを取得する:
*** -[CFString respondsToSelector:]: message sent to deallocated instance 0x3948d60
ここで私は、ユーザーのデフォルトに保存するために使用しているコードです。私も検索し、デバッグ目的のために保存されたオブジェクトをチェックしていることに注意してください。
-(void)saveToUserDefaults:(NSArray*)myArray
{
NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
if (standardUserDefaults) {
[standardUserDefaults setObject:[NSKeyedArchiver archivedDataWithRootObject:myArray] forKey:@"Assignments"];
[standardUserDefaults synchronize];
}
NSLog(@"Assignments array saved. (%d assignments in array)",[myArray count]);
NSData *dataCheck = [[NSData alloc] initWithData:[standardUserDefaults objectForKey:@"Assignments"]];
NSArray *arrayCheck = [[NSArray alloc] initWithArray:[NSKeyedUnarchiver unarchiveObjectWithData:dataCheck]];
NSLog(@"Checking saved array (%d assignments in array)",[arrayCheck count]);
if ([[arrayCheck objectAtIndex:0] isKindOfClass:[Assignment class]]) {
NSLog(@"It's of the class Assignment.");
}
Assignment *testAssignment = [[Assignment alloc] initWithAssignment:[arrayCheck objectAtIndex:0]];
NSLog(@"Title: %@ Course: %@",[testAssignment title],[testAssignment course]);
}
私はクラッシュが発生した場所ですtestAssignmentを割り当てるまで、すべてが正常です。誰もが任意のアイデアを持っていますか?
編集:ここで割り当てクラスの私NSCoding方法があります:
- (void)encodeWithCoder:(NSCoder *)coder {
[coder encodeObject:title forKey:@"title"];
[coder encodeObject:course forKey:@"course"];
[coder encodeObject:dueDate forKey:@"dueDate"];
[coder encodeObject:notes forKey:@"notes"];
}
- (id)initWithCoder:(NSCoder *)coder {
self = [[Assignment alloc] init];
if (self != nil)
{
title = [coder decodeObjectForKey:@"title"];
course = [coder decodeObjectForKey:@"course"];
dueDate = [coder decodeObjectForKey:@"dueDate"];
notes = [coder decodeObjectForKey:@"notes"];
}
return self;
}
解決
は、自分の質問に答えました。 initWithCoderでは、私が解読されたすべてのオブジェクトを保持するために必要なます:
//Example
title = [[coder decodeObjectForKey:@"title"] retain];
すべてが今、見事に動作します。 :)
所属していません StackOverflow