nskeyedarchiverでデータをどのように保存しますか?
-
14-10-2019 - |
質問
こんにちは、作成したクラスからオブジェクトを保存しようとしています。 Shotと呼ばれ、保存したい5つの変数が含まれています。これが.hファイルです--- NSCODINGとNSMUTABLECOPYING Protocalsと私の輸入品を遮断しましたが、それらはそこにあります。
#import <Foundation/Foundation.h>
@interface Shot : UIButton <NSCoding, NSMutableCopying> {
int x;
int y;
int location;
int quarter;
bool made;
int miss;
int make;
}
@property()int x;
@property()int y;
@property()int location;
@property()int quarter;
@property()bool made;
-(void)set_x:(int)my_x set_y:(int)my_y set_quarter:(int)my_quarter set_made:(bool)my_made set_location:(int)my_location;
-(void)set_miss_AND_set_make;
@end
**Here are the methods I made to save the data in my .m file---**
-(void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeInt:x forKey:@"x"];
[aCoder encodeInt:y forKey:@"y"];
[aCoder encodeInt:location forKey:@"location"];
[aCoder encodeInt:quarter forKey:@"quarter"];
[aCoder encodeBool:made forKey:@"made"];
}
-(id)initWithCoder:(NSCoder *)aDecoder {
if (self = [super init]) {
x = [aDecoder decodeIntForKey:@"x"];
y = [aDecoder decodeIntForKey:@"y"];
location = [aDecoder decodeIntForKey:@"location"];
quarter = [aDecoder decodeIntForKey:@"quarter"];
made = [aDecoder decodeBoolForKey:@"made"];
}
return self;
}
-(id)mutableCopyWithZone:(NSZone *)zone {
Shot *newShot = [[Shot allocWithZone:zone]init];
[newShot set_x:x set_y:y set_quarter:quarter set_made:made set_location:location];
return newShot;
}
これらの方法を使用すると、データを保存することができないようです
-(NSString *)getPath {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentFolder = [paths objectAtIndex:0];
NSFileManager *fm = [[NSFileManager alloc]init];
if ([fm fileExistsAtPath:documentFolder] == NO) {
[fm createDirectoryAtPath:documentFolder withIntermediateDirectories:YES attributes:nil error:nil];
}
return [documentFolder stringByAppendingFormat:@"iStatTrackInfo.archive"];
}
-(void)saveData {
NSString *path = [self getPath];
[NSKeyedArchiver archiveRootObject:shotArray toFile:path];
}
-(void)loadData {
NSString *path = [self getPath];
NSFileManager *fm = [[NSFileManager alloc]init];
if ([fm fileExistsAtPath:path] == YES) {
shotArray = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
return;
}
NSEnumerator *enumOne = [shotArray objectEnumerator];
Shot *shotObject = [[Shot alloc]init];
while (shotObject = [enumOne nextObject]) {
Shot *shotShot = [[Shot alloc]init];
shotShot = [shotObject mutableCopy];
shotShot.frame = CGRectMake(0, 0, 50, 50);
shotShot.backgroundColor = [UIColor whiteColor];
[self addSubview:shotShot];
}
}
保存方法とロードメソッドをボタンに設定しましたが、データはまだ保存されません。助けてください!!!
解決
私はついに問題を解決しました。上記のヘルプ以外に、.Archiveはファイルタイプではありません。 .ARCHIVEを保存することはできません。私の主な問題である.Archまたは.plistしか保存できません。
他のヒント
まず、あなたはふるいのように記憶を漏らしています。沢山の alloc/init
& mutableCopy
, 、 いいえ release
s。読むことをお勧めします メモリ管理ガイド.
次に、メソッド名がココアの規則に従っていません。これらは:
-(void)set_x:(int)my_x set_y:(int)my_y set_quarter:(int)my_quarter set_made:(bool)my_made set_location:(int)my_location;
-(void)set_miss_AND_set_make;
次のようなものでなければなりません:
-(void) resetMissAndMake; // or just missAndMake or activateMissAndMake
-(void) setX:(NSInteger)xValue y:(NSInteger)yValue quarter:(NSInteger)quarterValue location:(NSInteger)aLocation;
また、 getPath
ただしてください path
. 。付いたメソッド get
どちらも非常にまれであり、非常に具体的な意味を持っています。
これもナンセンスです:
Shot *shotObject = [[Shot alloc]init];
while (shotObject = [enumOne nextObject]) {
Shot *shotShot = [[Shot alloc]init];
shotShot = [shotObject mutableCopy];
どちらの必要もありません [[Shot alloc]init]
呼び出し(これらは両方とも漏れです)。
最後に、エンコードメソッドが誤って実装されます。 ドキュメントが述べているように, 、電話する必要があります super
適切に。
具体的には、あなた encodeWithCoder:
Superの同じ実装を呼び出す必要があります initWithCoder:
スーパーに電話する必要があります initWithCoder:
, 、 いいえ init
.