読んでくれてありがとう、
PS: 私は初心者なので、残念ながらこれはあまり得意ではありませんが、助けていただければ幸いです。
したがって、基本的には、 Account オブジェクトを含む大きな配列をアーカイブしたいと考えています。
1. NSString 形式のユーザー名、
2.NSNumbers で満たされた暗号化されたパスワード配列、および
- 3.サービス データ オブジェクトで満たされたデータ配列。
サービス データ オブジェクトには次のものがあります。
- 暗号化された serviceType (NSNumbers で満たされた NSArray) (ユーザー名とパスワードが対象とするサービスに関係なく)
- 暗号化されたユーザー名 (NSNumbers で満たされた NSArray)
- 暗号化されたパスワード (NSNumbers で満たされた NSArray)
奇妙なことに、これをアーカイブして保存しようとすると、2 つのエラーが発生します。Account クラスのデータ配列にサービス データ オブジェクトを追加できなくなり、次のエラー メッセージが表示されます (または、少なくとも NSTableView には表示されませんが、存在すると表示されます)。
[<ServiceData 0x60000023bfa0> valueForUndefinedKey:]: this class is not key value
coding-compliant for the key service.
2つ目は、アカウントクラスからユーザー名とパスワードでログインしようとすると、ユーザー名とパスワードの最初のカップルと最後のカップルの 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"];
}
サービスデータ クラス:
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
LOADING FILE(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];