質問

こんにちは、作成したクラスからオブジェクトを保存しようとしています。 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, 、 いいえ releases。読むことをお勧めします メモリ管理ガイド.

次に、メソッド名がココアの規則に従っていません。これらは:

-(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.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top