سؤال

لدي صفيف أقوم بحفظه إلى NSUserDefaults، الذي يحتوي على مجموعة من تعيينات الفصل المخصصة، والذي يتوافق مع بروتوكول NSCODING. يحفظ الصفيف ويحمل بشكل صحيح، ويمكنني التحقق من أن الكائن الأول المسترج للمجموعة هو مهمة الفصل. تحدث المشكلة عندما أحاول الوصول إلى ivars لكائن المهمة في الصفيف. تعطل وأحصل على الخطأ التالي:

*** -[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]);
}

كل شيء على ما يرام حتى تخصص اختبار، وهو المكان الذي يحدث فيه الحادث. هل لدى أي شخص أي أفكار؟

تحرير: إليك أساليب 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;
}
هل كانت مفيدة؟

المحلول

أجاب على سؤالي الخاص. في interwithcoder، كنت بحاجة للاحتفاظ بكل الأشياء التي كنت أفترضها:

//Example    
title = [[coder decodeObjectForKey:@"title"] retain];

كل شيء يعمل بشكل جميل الآن. :)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top