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

问题情境

 其实这是学习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];
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值