2016-07-17 15 views
0

私のクラスに問題があります。Objective-C:すべての配列要素の値が同じです

私は私の配列carteの私の一時的な状況を保存HistoryCardクラスを書きましたが、私はそれのすべてを復元するとき、それらはすべて同じ値を持っており、まさに私の配列carteの最後の状況のコピーが含まれています。 デバッグ領域に行くと、配列のすべての要素が同じアドレスを持つことがわかりましたが、その理由を理解できません。私gioco私は、配列の実際の条件を持っているCardcarteをしたと私は歴史

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

この場合、私はカードの新しいインスタンスにすべてのプロパティをコピーしています。

+0

self.carteを更新するコードを投稿できますか?あなたがそれを変更したとき、そしていつあなたのHistoryCardクラスを作成するのですか?self.carteの値を決して変更しないと、現在直面している問題が発生します。 – JingJingTao

+0

ここにはいくつかの異なる配列があります。どちらが同じ要素を持っていますか? – user2002649

+0

@ user2002649すべてのsituationAtThisTime配列のHistoryCardインスタンスは同じ値を持ちます。この配列では、ゲームの時刻Tに「カート」の配列状況を保存します。配列「カート」にはゲームのカードが入っています。タッチが届くと「カート」の配列にあるカードの値が変わります。 – ndPPPhz

答えて

0

self.situationAtThisTime=[NSMutableArray arrayWithArray:currentCardSituation];はアレイをコピーしますが、アレイ内のカードはコピーしません。各配列の要素0は、同じカードオブジェクトを指し示します。このカードを変更すると、すべての要素0が変更されます。あなたは、カードのコピーで配列の深いコピーを作成する必要があります。

self.situationAtThisTime = [[NSMutableArray alloc] initWithArray:currentCardSituation copyItems:YES]; 
+0

私はそれを試しましたが、私のアプリは 'PlayingCard copyWithZone:]:インスタンスに送られたセレクタが認識できないセレクタ0x7fd098d0f1c0'でクラッシュします.PlayingCardはCardのサブクラスです – ndPPPhz

+0

私のコピーに' copyWithZone: 'メソッドを実装しましたか? – ndPPPhz

+0

はい、 'PlayingCard'と' Card'クラスは 'NSCopying'プロトコルに準拠しなければなりません。 – Willeke

関連する問題