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

时间:2016-07-17 00:04:14

标签: objective-c arrays pointers deep-copy shallow-copy

我班上有问题。

我写了一个HistoryCard类来存储我的数组carte的临时情况但是当我恢复所有这些时,它们都具有相同的值并且确切地包含了最后一个情况的副本我的数组carte。 进入调试区域,我发现我的所有数组元素都有相同的地址,但我不明白为什么。

在我的gioco我有carte的数组Card,它具有实际条件,我想在历史记录中保存此数组的过去条件

#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包含我的类'Card'的实例。

@interface Card : NSObject

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


@end

通过UI,当我点击UIButton时,我修改了数组'carte'中相对索引的属性。它在我的gioco(英语游戏)中起作用,效果很好。所以我会创建一个我gioco的历史记录,因此,我会“冻结”我的纸牌游戏的每一个变化,并且我已经写了这个HistoryCard类。 你怎么看,这个类的每个实例都有这两个属性来保存我的游戏状态。

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

在这种情况下,我正在处理新卡片实例中的所有属性。

1 个答案:

答案 0 :(得分:0)

self.situationAtThisTime=[NSMutableArray arrayWithArray:currentCardSituation];复制数组,但不复制数组中的卡。每个数组中的元素0指向同一个卡对象。如果更改此卡,则每个元素0都会更改。您必须使用卡片的副本制作阵列的深层副本。

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