2013-11-19 6 views
0

Как сохранить/прочитать NSMutableArray, заполненный объектами, для которых я создал класс?Сохранение NSMutableArray, заполненного пользовательскими объектами

Это то, что я до сих пор ... (где «Objecta» представляет свой класс, и «объекты» представляет собой массив, содержащий множество примеров «Objecta»)

//Creating a file 
    //1) Search for the app's documents directory 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    //2) Create the full file path by appending the desired file name 
    NSString *documentFileName = [documentsDirectory stringByAppendingPathComponent:@"save.dat"]; 


    //Load the array 
    objects = [[NSMutableArray alloc] initWithContentsOfFile: _documentFileName]; 
    if(objects == nil) 
    { 
     //Array file didn't exist... create a new one 
     objects = [[NSMutableArray alloc]init]; 
     NSLog(@"Did not find saved list, Created new list."); 
    } 
    else 
    { 
     NSLog(@"Found saved list, Loading list."); 
    } 

Это загрузит массив если он существует. Он работает, если массив заполнен объектами типа свойств, такими как NSNumbers, я тестировал это. Если я заполню его своими собственными объектами, он сработает! Это ошибка: (где «objectAInt» является частным ИНТ, принадлежащий «Objecta»)

-[__NSCFNumber objectAInt]: unrecognized selector sent to instance 0x15d417f02013-11-19 17:28:58.645 My Project[1791:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFNumber objectAInt]: unrecognized selector sent to instance 0x15d417f0' 

Что мне нужно сделать, чтобы мой класс, «Objecta», работа с сохранения/чтения процесса, как это происходит с NSNumbers и другими объектами NS типа (id)?

Спасибо!

P.S. Мой класс реализует и совместим с NSCoding. Если вам нужна дополнительная информация, пожалуйста, не стесняйтесь спрашивать! :)

EDIT - Вот мой Objecta (по желанию) (это подкласс NSObject)

// 
// ObjectA.m 
// My Project 
// 
// Created by Will Battel on 8/8/13. 
// 
// 

#import "ObjectA.h" 

@implementation ObjectA 
@synthesize objectAString, objectAString2, objectAString3, objectAInt; 

-(id)initWithName:(NSString *)_objectAString{ 
    self = [super init]; 

    objectAString = _objectAString; 
    objectAInt = 2; 
    objectAString3 = @"$0.00"; 

    return self; 
} 

-(id)initWithCoder:(NSCoder *)decoder { 
    self = [super init]; 
    if (self) { 
     NSLog(@"Decoding"); 
     [self setObjectAString:[decoder decodeObjectForKey:@"objectAStringKey"]]; 
     [self setObjectAString2:[decoder decodeObjectForKey:@"objectAString2Key"]]; 
     [self setObjectAString3Price:[decoder decodeObjectForKey:@"objectAString3Key"]]; 
     [self setobjectAInt:[decoder decodeIntForKey:@"objectAIntKey"]]; 
    } 
    return self; 
} 

-(void)encodeWithCoder:(NSCoder *)encoder { 
    NSLog(@"Encoding"); 
    [encoder encodeObject:objectAString forKey:@"objectAStringKey"]; 
    [encoder encodeObject:objectAString2 forKey:@"objectAString2Key"]; 
    [encoder encodeObject:objectAString3 forKey:@"objectAString3Key"]; 
    [encoder encodeInt:objectAInt forKey:@"objectAIntKey"]; 
} 

@end 
+0

вы должны показать нам соответствующий код NSCoding. вы говорите, что это реализовано. возможно, это неисправно. – vikingosegundo

+0

Это вполне возможно, я добавлю! – WillB

+0

Когда я запускаю это, запускается NSLog (@ «Кодирование»), но NSLog (@ «Декодирование») никогда не идет. – WillB

ответ

0

NSNumber класс NSCoding соответствует. Соответствуют ли ваши собственные объекты NSCoding?

+0

Да, они совместимы с NSCoding. – WillB

1

Поскольку массив содержит NSCoding совместимых объектов, вы можете использовать методы кодирования, как это ...

- (NSMutableArray *)instancesFromArchive { 

    // compute documentFileName using your original code 

    if ([[NSFileManager defaultManager] fileExistsAtPath:documentFileName]) { 
     return [NSKeyedUnarchiver unarchiveObjectWithFile:documentFileName]; 
    } else { 
     return [NSMutableArray array]; 
    } 
} 

// archives my array of objects 
- (BOOL)archiveInstances { 

    // compute documentFileName using your original code 

    return [NSKeyedArchiver archiveRootObject:self.objects toFile:documentFileName]; 
} 
+0

На строке: "return [[self alloc] init];", что само собой называет? Поскольку это метод, я помещал его в реализацию контроллера представления, который отвечает за массив. Это, конечно, вызывает ошибку, так как я не выделяю контроллер View. Куда идет этот метод? Спасибо, я новичок в этом !!! :) – WillB

+0

Это был мой плохой, скопированный код из приложения, которое делает что-то похожее. См. Ответ сейчас. В другом месте вы можете просто сказать self.objects = [self instanceFromArchive]; – danh

+0

Спасибо за исправление этого, оно все еще не работает, но я думаю, что что-то, что я сделал, вызывает его, вероятно, связано с реализацией ObjectA NSCoding. – WillB

Смежные вопросы