2011-01-02 11 views
2

Hallo, ich versuche, ein Objekt aus einer Klasse zu speichern, die ich erstellt habe. Es heißt shot und enthält 5 Variablen, die ich speichern möchte. Hier ist die .h-Datei --- Es abgeschnitten NSCoding und NSMutableCopying Protocal und meine Importe, aber sie sind da.Wie speichern Sie Daten mit NSKeyedArchiver?

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

Ich kann meine Daten scheinen gerettet zu werden, wenn ich diese Methoden verwenden

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

ich die bis zu Tasten speichern und laden Methoden festgelegt haben, aber meine Daten noch gewonnen nicht speichern. Bitte helfen !!!

Antwort

2

Ich habe endlich das Problem gelöst. Anders als die obige Hilfe ist .archive kein Dateityp. Sie können kein Archiv speichern, Sie können nur eine .arch oder eine .plist speichern Das war mein Hauptproblem.

+0

Hey, danke für den Code, es hat mir geholfen – MyCSharpCorner

1

Zuerst verlieren Sie Speicher wie ein Sieb. Viele alloc/init & mutableCopy, keine release s. Ich würde vorschlagen, die memory management guide zu lesen.

Als nächstes folgen Ihre Methodennamen nicht den Cocoa-Konventionen. Diese:

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

Sollte so etwas wie:

-(void) resetMissAndMake; // or just missAndMake or activateMissAndMake 
-(void) setX:(NSInteger)xValue y:(NSInteger)yValue quarter:(NSInteger)quarterValue location:(NSInteger)aLocation; 

Auch sollte getPath nur path sein. Methoden mit dem Präfix get sind beide sehr selten und haben eine sehr spezifische Bedeutung.

Dies ist auch Unsinn:

Shot *shotObject = [[Shot alloc]init]; 
while (shotObject = [enumOne nextObject]) { 
    Shot *shotShot = [[Shot alloc]init]; 
    shotShot = [shotObject mutableCopy]; 

Es besteht keine Notwendigkeit für eine der beiden [[Shot alloc]init] Anrufe (das sind beide Lecks).

Schließlich sind Ihre Codierungsmethoden falsch implementiert. As the documentation states, müssen Sie super entsprechend aufrufen.

Insbesondere Ihre encodeWithCoder: müssen Super-Implementierung von derselben berufen und initWithCoder: sollte Super des initWithCoder: nennen, nicht init.

Verwandte Themen