2014-01-25 3 views
0

ThankYou для чтения,объектов Архивирование в пределах объектов в Objective-C

PS: Я новичок, так что я не слишком хорош в этом unfortunetaly, но любая помощь будет очень признателен

Поэтому в основном я хочу архивировать большой массив, содержащие объекты учетных записей, которые они сами содержат:

  • 1. имя пользователя в виде NSString,

  • 2. зашифрованный массив паролей, заполненный NSNumbers, и

  • 3. массив данных, заполненный служебными объектами данных.

объектов данных услуг имеют следующие:

    1. зашифрованного ServiceType (NSArray заполнены NSNumbers) (тот сервис, имя пользователя и пароль для)
    1. зашифрованное имя пользователя (NSArray, заполненный NSNumbers)
    1. зашифрованный пароль (NSArray заполнен NSNumbers)

Теперь удачливый при попытке архивировать и сохранить это, я получаю две ошибки. Один раз он не позволит мне добавлять объекты служебных данных в массив данных в классе Account больше со следующим сообщением об ошибке (или, по крайней мере, они не отображаются в NSTableView, которые у меня есть, однако он говорит, что они exsist):

[<ServiceData 0x60000023bfa0> valueForUndefinedKey:]: this class is not key value 
coding-compliant for the key service. 

и два, когда я пытаюсь войти в имя пользователя и пароль из класса Account, он получает имя пользователя и первые пару и последняя пара NSNumbers моего пароля правильно, но остальные NSNumbers для пароль в триллионах или что-то в этом роде, поэтому мне интересно, что происходит не так, любая помощь будет принята с благодарностью.

Вот код для моих переменных экземпляра, как я использовал NSKeyedArchiver и unarchiver, и как я пошел на сохранение и загрузку файлов. Опять же, пожалуйста, помогите мне, я застрял на этом какое-то время, и это отчасти мое последнее средство. Я понятия не имею, что происходит!


СЧЕТ КЛАСС:

H Файл:

@interface Account : NSObject <NSCoding> 
{ 
@private 
    NSString *username; 
    NSMutableArray *password; 
    NSMutableArray *accData; 
} 

@property NSString *username; 
@property NSArray *password; 

ПОЛНЫЙ M файла:

-(id)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super init]; 
    if(self) 
    { 
     username = [aDecoder decodeObjectForKey:@"username"]; 
     password = [aDecoder decodeObjectForKey:@"password"]; 
     accData = [aDecoder decodeObjectForKey:@"data"]; 
    } 
    return self; 
} 

-(void)encodeWithCoder:(NSCoder *)aCoder 
{ 
    [aCoder encodeObject:username forKey:@"username"]; 
    [aCoder encodeObject:password forKey:@"password"]; 
    [aCoder encodeObject:accData forKey:@"data"]; 
} 

SERVICEDATA КЛАСС:

H Файл:

@interface ServiceData : NSObject <NSCoding> 
{ 
@private 
    NSArray* serviceData; 
    NSArray* usernameData; 
    NSArray* passwordData; 
} 

@property NSArray* serviceData; 
@property NSArray* usernameData; 
@property NSArray* passwordData; 

M файла:

#import "Account.h" 
#import "Crypt.h" 

NSMutableArray *accounts; 
NSInteger accountNumber = -1; 


@implementation Account 

@synthesize username; 
@synthesize password; 

- (id)initWithUsername:(NSString *)name withPassword:(NSMutableArray *)key 
{ 
    self = [super init]; 
    if (self) 
    { 
     username = name; 
     password = key; 
     accData = [[NSMutableArray alloc]init]; 
    } 
    return self; 
} 


/* 
setters and getters 
*/ 

-(NSString*)getUsername; 
{ 
    return username; 
} 
-(NSArray*)getPassword; 
{ 
    return password; 
} 
-(void)changePassword:(NSMutableArray*)newPassword; 
{ 
    NSInteger sizeOldPass = [password count]; 
    NSInteger sizeNewPass = [newPassword count]; 
    int changeXObjects = (int)(sizeNewPass - sizeOldPass); 
    int changeSize = abs(changeXObjects); 
    //adjusts size differences 
    if (changeXObjects < 0) 
    { 
     for(int i = 0; i < changeSize; i++) 
     { 
      [password removeLastObject]; 
     } 
    } 
    else if (changeXObjects > 0) 
    { 
     for(int i = 0; i < changeSize; i++) 
     { 
      NSNumber *value = [NSNumber numberWithInt:0]; 
      [password addObject:value]; 
     } 
    } 

    //change password 
    NSInteger sizePass = [password count]; 
    for (int k = 0; k < sizePass; k++) 
    { 
     [password replaceObjectAtIndex:k withObject:newPassword[k]]; 
    } 
} 

-(NSMutableArray*)getAccData; 
{ 
    return accData; 
} 
-(void)setAccData:(NSMutableArray*)input 
{ 
    [input setArray: accData]; 
} 

+(NSMutableArray*)getAccounts 
{ 
    return accounts; 
} 

+(NSInteger)getAccountNumber 
{ 
    return accountNumber; 
} 

+(void)setAccounts:(id)accs 
{ 
    accounts = accs; 
} 

+(void)setAccountNumber:(NSInteger)number 
{ 
    accountNumber = number; 
} 


/* 
other methods 
*/ 

+(void)addAccount:(id)acc 
{ 
    [accounts addObject:acc]; 
} 
+(void)deleteAccount:(NSInteger)index 
{ 
    [accounts removeObjectAtIndex:index]; 
} 


-(void)addAccData:(id)input 
{ 
    [accData addObject:input]; 
} 

-(void)deleteAccDataAt:(NSInteger)index 
{ 
    [accData removeObjectAtIndex:index]; 
} 

+(bool)checkPassword:(NSString*)passwordIn accountNumber:(NSInteger)index 
{ 
    NSMutableArray *passwordInputCrypt = [Crypt encrypt:passwordIn]; 
    NSMutableArray *passwordCrypt = [accounts[index] getPassword]; 

    NSInteger lengthPassword = [passwordInputCrypt count]; 

    bool correctPassword = true; 
    if([passwordCrypt count] == [passwordInputCrypt count]) 
    { 
     for(int i = 0; i < lengthPassword; i++) 
     { 
      if(passwordCrypt[i]!=passwordInputCrypt[i]) 
       correctPassword = false; 
     } 
    } 
    else 
    { 
     correctPassword = false; 
    } 

    if(correctPassword == true) 
    { 
     return true; 
    } 
    return false; 
} 


-(id)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super init]; 
    if(self) 
    { 
     username = [aDecoder decodeObjectForKey:@"username"]; 
     password = [aDecoder decodeObjectForKey:@"password"]; 
     accData = [aDecoder decodeObjectForKey:@"data"]; 
    } 
    return self; 
} 

-(void)encodeWithCoder:(NSCoder *)aCoder 
{ 
    [aCoder encodeObject:username forKey:@"username"]; 
    [aCoder encodeObject:password forKey:@"password"]; 
    [aCoder encodeObject:accData forKey:@"data"]; 
} 
@end 

ЗАГРУЗКА ФАЙЛА (Filepath дается):

NSData *data = [[NSFileManager defaultManager] contentsAtPath:filePath]; 

if(data != nil) 
{ 
    NSArray *arrayFromData = [NSKeyedUnarchiver unarchiveObjectWithData:data]; 
    NSMutableArray *initArray = [NSMutableArray arrayWithArray:arrayFromData]; 
    [Account setAccounts:initArray]; 
} 
else 
{ 
    NSMutableArray *accountsInit = [[NSMutableArray alloc] init]; 
    [Account setAccounts:accountsInit]; 
} 

СОХРАНЕНИЕ ФАЙЛА:

NSArray *accounts = [Account getAccounts]; 
NSString *filePath = [AppController getFilePath]; 
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:accounts]; 

[data writeToFile:filePath atomically:YES]; 

ответ

0

Несколько вещей:

  1. Вы не должны архивировать данные паролей на диск (даже если вы его шифруете). Для этого нужен брелок. Посмотрите на SSKeychain для хорошего класса обертки.
  2. Ошибка кодирования ключевого значения, которую вы получаете, предполагает, что вы пытаетесь ссылаться на свой массив servicesData как на «службу» где-то. Проверьте свои команды valueForKey и setValueForKey.

Можете ли вы опубликовать остальную часть класса учетной записи? Этот метод setAccounts выглядит так, как будто это может быть актуальным.

Также есть причина, по которой вы используете Keyed Archiving вместо Core Data?

+0

Я очень новичок, я не знал, что есть такие вещи, как Core Data, а метод setAccounts просто соединяет одну учетную запись с другой через указатели, она на самом деле ее не копирует, но да, я обновлю это, и большое спасибо. – jundl77

+0

Кроме того, с помощью «servie», не будет ли это связано с ошибкой компиляции ?, потому что она компилирует – jundl77

+0

Нет, принцип кодирования ключевого значения заключается в том, что он добавляет динамическую типизацию, чтобы вы могли установить любое значение, которое вам нравится, даже если приемник не существует. Вот почему вы получаете эту ошибку - происходит то, что где-то в вашем коде есть что-то, пытающееся либо установить, либо получить ключ в классе ServiceData с ключом «услуга». Это почти наверняка опечатка в вашем коде где-то. – smyrgl

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