アプリを停止して再起動するまで、アプリは正常に動作します - アーカイブ ファイル - highScores.archive が存在します。次に、アプリがエンコードを中断します。最初の行で EXC_BAD_ACCESS を取得します (長い間、エンコードしている日付オブジェクトに到達するまで発生しませんでした。
私の推測では、いくつかの場所に保持を配置する必要があると思いますが、どこにあるのかわかりません。
コード:
FlipHighScores.h
...
@interface FlipHighScores : NSObject <NSCoding> {
//NSString *themeChosen;
NSInteger newHighScore;
NSInteger newScoreStartLevel;
NSInteger newScoreFinishLevel;
NSDate *scoreDateCreated;}
@property (copy, nonatomic) NSString *themeChosen;
@property (nonatomic) NSInteger highScore;
@property (nonatomic) NSInteger scoreStartLevel;
@property (nonatomic) NSInteger scoreFinishLevel;
@property (nonatomic, readonly, strong) NSDate *scoreDateCreated;
...
FlipHighScores.m ...
@synthesize themeChosen = _themeChosen;
@synthesize highScore = _highScore;
@synthesize scoreStartLevel = _scoreStartLevel;
@synthesize scoreFinishLevel = _scoreFinishLevel;
@synthesize scoreDateCreated = _scoreDateCreated;
...
-(void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:_themeChosen forKey:@"_themeChosen"];
NSLog(@"Theme Chosen is %@", _themeChosen);
[aCoder encodeInt:_highScore forKey:@"_highScore"];
[aCoder encodeInt:_scoreStartLevel forKey:@"_scoreStartLevel"];
[aCoder encodeInt:_scoreFinishLevel forKey:@"_scoreFinishLevel"];
NSLog(@"Date Created in encodeWithCoder is %@", _scoreDateCreated);
[aCoder encodeObject:_scoreDateCreated forKey:@"_scoreDateCreated"];}
-(id)initWithCoder:(NSCoder *)aDecoder {
if (self) {
_themeChosen = [aDecoder decodeObjectForKey:@"_themeChosen"];
_highScore = [aDecoder decodeIntForKey:@"_highScore"];
_scoreStartLevel = [aDecoder decodeIntForKey:@"_scoreStartLevel"];
_scoreFinishLevel = [aDecoder decodeIntForKey:@"_scoreFinishLevel"];
_scoreDateCreated = [aDecoder decodeObjectForKey:@"_scoreDateCreated"];
}
return self;}
-(NSString *)description {
NSDate *date = _scoreDateCreated;
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter setDateStyle:NSDateFormatterShortStyle];
NSString *dateString = [dateFormatter stringFromDate:date];
//NSLog(@"dateString from description is %@", dateString);
NSString *descriptionString = [[NSString alloc] initWithFormat:@"%d %@ S:%d F:%d D:%@", _highScore, _themeChosen, _scoreStartLevel, _scoreFinishLevel, dateString];
return descriptionString:}
ややこしいのは、保存ファイル (highScores.archive) を削除してアプリを実行すると、問題なく実行されることです。アプリを停止して強制終了し、再度起動します。最初にエンコーディングが呼び出されたときにクラッシュします。
themeChosen オブジェクトをエンコードする行。「保持」またはに変更することで修正されるデコードの問題に関するいくつかの投稿を読みました。フォーマット(なぜそれが役立つのか、私にはよくわかりません)。しかし、これはエンコーディングです。デコードはおそらく次の質問になるでしょう...
このプロジェクトでは ARC を使用していません。たぶん、すべてを最初から再構築すると...
ああ、Theme 変数の追跡を追加するまでテストした限り、すべてがスムーズに実行されていたことを忘れていました。その後、ここで述べたように、事態は少しうまくいきませんでした。