问题情境
其实这是学习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];