【iOS】自定义对象深拷贝、浅拷贝

版权声明:Pain is just in your mind. https://blog.csdn.net/yzt33/article/details/45875597

问题情境

 其实这是学习ios第二天,看了斯坦福大学的2013年秋季iOS公开课,做了一个纸牌匹配小游戏。其中遇到的问题不少,关于object-c的学习就不再赘述,其中的一个问题我觉得在这里记一笔,对今后有帮助——自定义对象的深拷贝、浅拷贝。

 我有一个CCard类,用一个NSMutableArray来保存,我打算在牌堆中随机挑选6张牌(屏幕就打算放12张),再随机放入NSMutableArray中。我计划随机找出两个下标,对应放入CCard对象。

 结果在我测试游戏的时候,发现只要我点击某张牌,另一张相同的牌就会出现(游戏没做好,外挂倒是先做好了,哈哈)。问题其实是我放入在NSMutableArray中的东西都是CCard指针,所以我认为要深拷贝这个自定义对象。

深拷贝原理

 在c++中,我知道一个类可以写它的复制函数和重载=函数,在其中实现深/浅拷贝。但在object-c中的,需要让自定义的类具有copy方法,那么就要让这个类实现NSCopying协议。

自定义的类

CCard.h

@interface CCard : NSObject<NSCopying>

//卡片内容
@property (strong, nonatomic) NSString *contents;

//记录卡片是否被选中
@property (nonatomic, getter=isChosen) BOOL chosen;

//记录卡片是否已匹配
@property (nonatomic, getter=isMatched) BOOL matched;

//设置当前卡片选中状态
-(void)setChosen:(BOOL)choose;

//匹配多张片,获得匹配程度分数
-(int)match:(NSMutableArray *)otherCard;

@end

CCard.m

//自定义深拷贝,实现copyWithZone方法
-(id)copyWithZone:(NSZone *)zone{
    CCard *newCard = [[[self class] allocWithZone:zone] init];

    [newCard setContents:self.contents];
    [newCard setMatched:self.matched];
    [newCard setChosen:self.chosen];
    return newCard;
}

实际调用

self.cards[res[1]] = [tmpCard copy];
阅读更多
换一批

没有更多推荐了,返回首页