私のクラスに問題があります。Objective-C:すべての配列要素の値が同じです
私は私の配列carte
の私の一時的な状況を保存HistoryCard
クラスを書きましたが、私はそれのすべてを復元するとき、それらはすべて同じ値を持っており、まさに私の配列carte
の最後の状況のコピーが含まれています。 デバッグ領域に行くと、配列のすべての要素が同じアドレスを持つことがわかりましたが、その理由を理解できません。私gioco
私は、配列の実際の条件を持っているCard
のcarte
をしたと私は歴史
#import "Gioco.h"
#import "HistoryCard.h"
@interface Gioco()
@property (nonatomic,readwrite) int punteggioPartita;
@property (nonatomic,strong) NSMutableArray* carte; // of Card
@property (nonatomic,strong) NSMutableArray* history; // of HistoryCard Class
@end
carte
は私のクラスのインスタンスを含む配列で、この配列の過去の状態を保存したい「カードで
' UIによって
@interface Card : NSObject
@property (nonatomic) BOOL chosen;
@property (nonatomic) BOOL match;
@end
、私はUIButton
をクリックしたとき、私は配列「アラカルト」でこれに相対的なインデックスのプロパティを変更します。それは私のgioco
(英語でのゲーム)の本質的な作品です、完璧に動作します。だから私はgioco
の歴史を作り、この理由から、私は自分のカードゲームのすべての変更を「フリーズ」し、このHistoryCardクラスを書きました。 このクラスのすべてのインスタンスには、ゲームの状態を保存するこの2つのプロパティがあります。
#import "Card.h"
@interface HistoryCard : Card
@property (nonatomic,readonly,strong) NSMutableArray* situationAtThisTime; //of Array
@property (nonatomic,readonly) int score;
-(instancetype)initWithCurrentSituation:(NSArray*)currentCardSituation
andCurrentScore:(int) scoreSituation;
//designer initializzer
@end
#import "HistoryCard.h"
#import "PlayingCard.h"
@interface HistoryCard()
@property (nonatomic,strong,readwrite) NSMutableArray* situationAtThisTime; //of Array
@property (nonatomic,readwrite) int score;
@end
@implementation HistoryCard
-(instancetype)initWithCurrentSituation:(NSMutableArray*)currentCardSituation
andCurrentScore:(int) scoreSituation{
self=[super init];
if (self) {
self.situationAtThisTime=[NSMutableArray arrayWithArray:currentCardSituation];
self.score=scoreSituation;
}
return self;
}
@end
タッチが到着すると、プロパティの値を変更し、このような理由のために、私は、アレイ「カルト」の実際の状態を凍結し、それを追加するHistoryCard
のインスタンスを作成し、私のgioco
で方法が開始私のカードゲームの配列history
HistoryCard* currentHistory=[[HistoryCard alloc] initWithCurrentSituation:self.carte andCurrentScore:self.punteggioPartita];
[self.history addObject:currentHistory];
問題がある:私のhistory
配列が3つのHistoryCardインスタンスが含まれている場合は、そのすべてのは、正しく設定スコアプロパティ(過去のゲームのスコア)が、situationAtThisTime
アレイを有し、 、それはすべての私の配列carte
の最後の状況のコピーを正確に含んでいます。 私が保存したいと思っていた配列のように、配列の実際の状態を指していますcarte
私はここで探していましたが、助けになるものは何も見つかりませんでした。 questionにはちょっとした助けがありますが、グローバル変数はありません。
ありがとうございます。
PS 私は個人的な解決策を見つけましたが、私にはそのような方法があるかどうかはわかりません。
NSMutableArray* now=[[NSMutableArray alloc]init];
for (Card*card in self.carte) {
Card* toSend=[[Card alloc]init];
toSend.chosen=card.chosen;
toSend.match=card.match;
toSend.valore=card.valore;
[now addObject:toSend];
}
HistoryCard* currentHistory=[[HistoryCard alloc]initWithCurrentSituation:now
andCurrentScore: self.punteggioPartita];
[self.history addObject:currentHistory];
この場合、私はカードの新しいインスタンスにすべてのプロパティをコピーしています。
self.carteを更新するコードを投稿できますか?あなたがそれを変更したとき、そしていつあなたのHistoryCardクラスを作成するのですか?self.carteの値を決して変更しないと、現在直面している問題が発生します。 – JingJingTao
ここにはいくつかの異なる配列があります。どちらが同じ要素を持っていますか? – user2002649
@ user2002649すべてのsituationAtThisTime配列のHistoryCardインスタンスは同じ値を持ちます。この配列では、ゲームの時刻Tに「カート」の配列状況を保存します。配列「カート」にはゲームのカードが入っています。タッチが届くと「カート」の配列にあるカードの値が変わります。 – ndPPPhz