ThankYou для чтения,объектов Архивирование в пределах объектов в Objective-C
PS: Я новичок, так что я не слишком хорош в этом unfortunetaly, но любая помощь будет очень признателен
Поэтому в основном я хочу архивировать большой массив, содержащие объекты учетных записей, которые они сами содержат:
1. имя пользователя в виде NSString,
2. зашифрованный массив паролей, заполненный NSNumbers, и
- 3. массив данных, заполненный служебными объектами данных.
объектов данных услуг имеют следующие:
-
- зашифрованного ServiceType (NSArray заполнены NSNumbers) (тот сервис, имя пользователя и пароль для)
-
- зашифрованное имя пользователя (NSArray, заполненный NSNumbers)
-
- зашифрованный пароль (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];
Я очень новичок, я не знал, что есть такие вещи, как Core Data, а метод setAccounts просто соединяет одну учетную запись с другой через указатели, она на самом деле ее не копирует, но да, я обновлю это, и большое спасибо. – jundl77
Кроме того, с помощью «servie», не будет ли это связано с ошибкой компиляции ?, потому что она компилирует – jundl77
Нет, принцип кодирования ключевого значения заключается в том, что он добавляет динамическую типизацию, чтобы вы могли установить любое значение, которое вам нравится, даже если приемник не существует. Вот почему вы получаете эту ошибку - происходит то, что где-то в вашем коде есть что-то, пытающееся либо установить, либо получить ключ в классе ServiceData с ключом «услуга». Это почти наверняка опечатка в вашем коде где-то. – smyrgl