Objective-C :我所有的数组元素都具有相同的值

Objective-C : all of my array elements have the same value

我的 class 有问题。

我写了一个 HistoryCard class 来存储我的数组的临时情况 carte 但是当我恢复所有这些时,它们都具有相同的值并且完全包含我的数组 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 包含我的 class 'Card' 的实例。

@interface Card : NSObject

@property (nonatomic) BOOL chosen;
@property (nonatomic) BOOL match;


@end

通过UI,当我点击一个UIButton时,我修改了数组'carte'中相对索引的属性。事实上,我的 gioco(英文游戏)非常有效。所以我会为我的 gioco 创建一个历史记录,出于这个原因,我会 "freeze" 我的纸牌游戏的每一个变化,我写了这张 HistoryCard Class。 你怎么看,这个 class 的每个实例都有这两个属性来保存我的游戏状态。

#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

当触摸到达时,在我的 gioco 中启动一个方法来更改属性的值,因此我创建了一个 HistoryCard 的实例,它将冻结数组的实际状态 'carte' 并将其添加到我的纸牌游戏

的数组 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.situationAtThisTime=[NSMutableArray arrayWithArray:currentCardSituation]; 复制数组但不复制数组中的卡片。每个数组中的元素 0 指向同一个卡片对象。如果您更改此卡,则每个元素 0 都会更改。您必须使用卡片的副本对数组进行深度复制。

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