2

こんにちは、私は自分が作成したクラスからオブジェクトを保存しようとしています。これはショットと呼ばれ、保存したい5つの変数が含まれています。これが.hファイルです--- NSCodingとNSMutableCopyingProtocalsと私のインポートを遮断しましたが、それらはそこにあります。

#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];
 }
}

保存と読み込みの方法をボタンまで設定しましたが、データは保存されません。助けてください!!!

4

2 に答える 2

2

私はついに問題を解決しました。上記のヘルプを除いて、.archiveはファイルタイプではありません。.archiveを保存することはできません。保存できるのは、.archまたは.plistだけです。これが私の主な問題でした。

于 2011-04-15T03:26:48.347 に答える
1

まず、ふるいのようにメモリリークが発生しています。たくさんのalloc/initmutableCopy、いいえreleaseメモリ管理ガイドを読むことをお勧めします。

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

-(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:superを呼び出す必要があります。initWithCoder:init

于 2011-01-02T06:04:40.577 に答える