私が作っている小さなiPhoneアプリケーションでは、NSMutableArrayをソートしたいと思います。NSMutableArrayをカスタムオブジェクトでソートするといくつかのオブジェクトが上書きされます
私はこれを行う2つの方法を見つけましたが、どちらも同じことになります。配列をソートすると、いくつかのオブジェクトが互いに上書きされます。
まず第一に、ここに私のコードは次のとおりです。
AppDelegate.h
NSMutableArray* highScores;
どこかでダウン私はdifferenからアクセスできるようにAppDelegate.hが、私もこの変数プロパティを作ることクラス:
私のアプリケーションが起動すると、ファイルからハイスコアを読み込み、それらをNSMutableArrayにインポートします。
AppDelegate.m
NSMutableData* data = [NSData dataWithContentsOfFile:highScoresPath];
NSKeyedUnarchiver* decoder = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
self.highScores = [decoder decodeObjectForKey:@"highscoresArray"];
私はこのNSMutableArrayの中で保存したオブジェクトは型ハイスコアからです。
HighScore.h
@interface HighScore : NSObject {
int score;
int roundsPlayed;
int wrongAnswers;
NSString* name;
NSDate* datetime;
}
@property int score;
@property int roundsPlayed;
@property int wrongAnswers;
@property (nonatomic, copy) NSDate* datetime;
@property (nonatomic, copy) NSString* name;
- (id) init;
- (void) update:(int)roundScore:(BOOL) correct;
@end
HighScore.m
#import "HighScore.h"
@implementation HighScore
@synthesize score, roundsPlayed, wrongAnswers, name, datetime;
- (id) init
{
self.name = @"";
self.score = 0;
self.roundsPlayed = 0;
self.wrongAnswers = 0;
self.datetime = [NSDate date];
return self;
}
- (void) update:(int)roundScore:(BOOL) correct
{
self.score += roundScore;
if (!correct)
self.wrongAnswers++;
self.roundsPlayed++;
self.datetime = [NSDate date];
}
- (id) initWithCoder:(NSCoder *) decoder
{
self.name = [[decoder decodeObjectForKey:@"name"] retain];
self.score = [decoder decodeIntForKey:@"score"];
self.roundsPlayed = [decoder decodeIntForKey:@"roundsPlayed"];
self.wrongAnswers = [decoder decodeIntForKey:@"wrongAnswers"];
self.datetime = [[decoder decodeObjectForKey:@"datetime"] retain];
return self;
}
- (void) encodeWithCoder:(NSCoder *)encoder
{
[encoder encodeObject:self.name forKey:@"name"];
[encoder encodeInt:self.score forKey:@"score"];
[encoder encodeInt:self.roundsPlayed forKey:@"roundsPlayed"];
[encoder encodeInt:self.wrongAnswers forKey:@"wrongAnswers"];
[encoder encodeObject:self.datetime forKey:@"datetime"];
}
- (NSComparisonResult) compareHighscore:(HighScore*) h
{
return [[NSNumber numberWithInt:self.score] compare:[NSNumber numberWithInt:h.score]];
}
@end
さて、私は次のコードを使用して、私の配列をソートしようとすると:
NSArray *sortedArray;
sortedArray = [highScores sortedArrayUsingSelector:@selector(compareHighscore:)];
それはどういうわけかねじ込み私のhighScores配列、私は同じスコアと名前で最高スコアのX amoundを取得します。
私は間違っていますか?
これは実際にsortedArrayUsingSelectorの呼び出しによって引き起こされていることは確かですか?前と後の実際のhighScores配列を見てみましたか?あなたのコードのどこかに、重複したオブジェクトを挿入している可能性のあるhighScores配列にオブジェクトを追加することがありますか?覚えておいてください - これはセットではないので、同じハイスコアオブジェクトを複数回挿入すると配列内に複数回表示されますが、配列内のオブジェクト参照であるためスコアは常に同じになります。 –
私は同意します。私はあなたの 'NSArray * sortedArray;行の直前にブレークポイントを置いて、次にgdbに配列を出力することをお勧めします:' po highScores' –