我的这个配置玩h1z1。h1z1分辨率率开1980渲染开100根本玩不了,卡的要死,只有

&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!&其实这是学习ios第二天,看了斯坦福大学的2013年秋季iOS公开课,做了一个纸牌匹配小游戏。其中遇到的问题不少,关于object-c的学习就不再赘述,其中的一个问题我觉得在这里记一笔,对今后有帮助——自定义对象的深拷贝、浅拷贝。
&我有一个CCard类,用一个NSMutableArray来保存,我打算在牌堆中随机挑选6张牌(屏幕就打算放12张),再随机放入NSMutableArray中。我计划随机找出两个下标,对应放入CCard对象。
&结果在我测试游戏的时候,发现只要我点击某张牌,另一张相同的牌就会出现(游戏没做好,外挂倒是先做好了,哈哈)。问题其实是我放入在NSMutableArray中的东西都是CCard指针,所以我认为要深拷贝这个自定义对象。
深拷贝原理
&在c++中,我知道一个类可以写它的复制函数和重载=函数,在其中实现深/浅拷贝。但在object-c中的,需要让自定义的类具有copy方法,那么就要让这个类实现NSCopying协议。
自定义的类
@interface CCard : NSObject&NSCopying&
@property (strong, nonatomic) NSString *
@property (nonatomic, getter=isChosen) BOOL
@property (nonatomic, getter=isMatched) BOOL
-(void)setChosen:(BOOL)
-(int)match:(NSMutableArray *)otherC
-(id)copyWithZone:(NSZone *)zone{
CCard *newCard = [[[self class] allocWithZone:zone] init];
[newCard setContents:self.contents];
[newCard setMatched:self.matched];
[newCard setChosen:self.chosen];
return newC
self.cards[res[1]] = [tmpCard copy];
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:20673次
积分:1064
积分:1064
排名:千里之外
原创:88篇
(2)(1)(1)(2)(2)(3)(3)(1)(14)(25)(4)(15)(15)(5)2015年5月 移动开发大版内专家分月排行榜第一2015年4月 移动开发大版内专家分月排行榜第一2014年9月 移动开发大版内专家分月排行榜第一
2015年3月 移动开发大版内专家分月排行榜第二2014年8月 移动开发大版内专家分月排行榜第二
2015年5月 移动开发大版内专家分月排行榜第一2015年4月 移动开发大版内专家分月排行榜第一2014年9月 移动开发大版内专家分月排行榜第一
2015年3月 移动开发大版内专家分月排行榜第二2014年8月 移动开发大版内专家分月排行榜第二
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。Objective-C中的浅拷贝和深拷贝
招聘信息:
浅拷贝浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间。如:char*&str&=&(char*)malloc(100);
char*&str2&=&浅拷贝只是对对象的简单拷贝,让几个对象共用一片内存,当内存销毁的时候,指向这片内存的几个指针需要重新定义才可以使用,要不然会成为野指针。iOS 里面的浅拷贝:在 iOS 里面, 使用retain&关键字进行引用计数,就是一种更加保险的浅拷贝。他既让几个指针共用同一片内存空间,又可以在release 由于计数的存在,不会轻易的销毁内存,达到更加简单使用的目的。深拷贝:深拷贝是指拷贝对象的具体内容,而内存地址是自主分配的,拷贝结束之后,两个对象虽然存的值是相同的,但是内存地址不一样,两个对象也互不影响,互不干涉。copy&与&retain&的区别:copy&是创建一个新对象,retain&是创建一个指针,引用对象计数加一。&copy属性标识两个对象内容相同,新的对象retain count为1, 与旧有对象引用计数无关,旧有对象没有变化。copy减少对象对上下文的依赖。iOS里的深拷贝:iOS提供了copy和mutableCopy方法,顾名思义,copy就是复制了一个imutable的对象,而mutableCopy就是复制了一个mutable的对象。以下将举几个例子来说明。这里指的是NSString,&NSNumber等等一类的对象。NSString&*string&=&@”dddd&;
NSString&*stringCopy&=&[string&copy];
NSMutableString&*stringDCopy&=&[string&mutableCopy];
[stringMCopy&appendString:@&!!&];查看内存可以发现,string和stringCopy指向的是同一块内存区域(weak reference),引用计数没有发生改变。而stringMCopy则是我们所说的真正意义上的复制,系统为其分配了新内存,是两个独立的字符串内容是一样的。拷贝构造:当然在 ios 中并不是所有的对象都支持copy,mutableCopy,遵守NSCopying协议的类可以发送copy消息,遵守NSMutableCopying协议的类才可以发送mutableCopy消息。假如发送了一个没有遵守上诉两协议而发送copy或者&mutableCopy,那么就会发生异常。但是默认的ios类并没有遵守这两个协议。如果想自定义一下copy&那么就必须遵守NSCopying,并且实现&copyWithZone:&方法,如果想自定义一下mutableCopy&那么就必须遵守NSMutableCopying,并且实现&mutableCopyWithZone:&方法。如果是我们定义的对象,那么我们自己要实现NSCopying&,&NSMutableCopying这样就能调用copy和mutablecopy了。举个例子:@interface&MyObj&:&NSObject&NSCopying,&NSMutableCopying&{
&&&&NSMutableString&*_
&&&&NSString&*&_imutableStr&;
@property&(nonatomic,&retain)&NSMutableString&*
@property&(nonatomic,&retain)&NSString&*imutableS
@property&(nonatomic)&int&copy拷贝构造:-&(id)copyWithZone:(NSZone&*)zone{
&&&&MyObj&*copy&=&[[[self&class]&allocWithZone&:zone]&init];
&&&&copy-&name&=&[_name&copy];
&&&&copy-&imutableStr&=&[_imutableStr&copy];
&&&&copy-&age&=&
&&&&return&
}mutableCopy拷贝构造:-&(id)mutableCopyWithZone:(NSZone&*)zone{
&&&&MyObj&*copy&=&NSCopyObject(self,&0,&zone);
&&&&copy-&name&=&[_name&mutableCopy];
&&&&copy-&age&=&
&&&&return&
微信扫一扫
订阅每日移动开发及APP推广热点资讯公众号:CocoaChina
您还没有登录!请或
点击量9372点击量7466点击量7398点击量4543点击量4103点击量3825点击量3256点击量3139点击量2808
&2016 Chukong Technologies,Inc.
京公网安备89IOS&-----&对象复制
对象复制,顾名思义就是将一个已有的对象复制一份出来,开辟一个新的内存来储存对象,相当于一个副本;对象复制又分为浅拷贝和深拷贝;这里我们就来简单的介绍下对象复制。
Foundation框架张支持复制的对象有NString、NSArra、NSNumber、NSDictionar、NSMutableString、NSMutablerArray、NSMutableDictionary等。我们可以自定义对象来支持复制,一个前提条件就会必须实现NSCopying协议或者NSMutableCopying协议或者两者都实现。
首先我们先来区分下copy、retain,先举个例子,可能会更清晰很多;
NSArray *array = @[@"one", @"two", @"three",
@"four"&];
NSMutableArray *array1 = [array retain];
[array1 removeLastObject];
for(NSObject* obj in array)
NSLog(@"%@", obj);
NSArry *array2 = @[@"one", @"two", @"three", @"four" ];
NSMutableArray *array3 = [array copy];
[array3 removeLastObject];
for(NSObject* obj in array2)
NSLog(@"%@", obj);
这样打印出来的结果是,第一次打印的时候只打印出3个元素,第二次打印的时候打印出4个元素。
retain、copy总结:
retain只是引用计数加1,两个指针指同一个内存,也就是array和array1共享一块内存;
copy是开辟出一个内存,两个指针指向两块内存,array2、array3都拥有自己的内存;
复制对象的种类:
copy:产生对象的副本是不可变的
mutableCopy:产生的对象副本是可变的
可变与不可变的区别就是是否可以对对象内容进行增删改,比如NSMutableArray与NSArray,我们可以为NSMutableArray增加元素、删除元素、修改元素等操作,而对于NSArray对象就不可以。
同样我们举个例子来区分下copy与mutablecopy:
NSArray *array = [[NSArray alloc] initWithObject:@"one", @"two",
@"three",nil];
NSArray *array1 = [array copy];
NSMutableArray * array2 = [array muttablecopy];
[array1 addObject:@"five"]; //程序执行到这里报错
[array2 addObject:@"four"];
很明显,copy和mutablecopy返回的对象不同,copy返回的是不可变的,mutablecopy返回的是可变的。
可能有些人会问,array1我用NSMutableArray来定义不就可以么,他也不报错。但是结果不是你想的那样的,可能你觉得这样可行,但copy就要跟你过不去了。copy返回的指针是不可变的对象,如果你用NSMutableArray来定义array1,即NSmutableArray
array1 = [array
copy];用copy来复制对象,他返回的对象只能交给不可变的对象,你这样把他强扭过来,他还是不可变的。就像一块橡皮泥,你怎么捏各种形状出来,他还是一个橡皮泥,不可能变为一个蛋糕或者饼干。你想要返回一个可变对象,就只能使用mutablecopy。
这里就是copy和mutablecopy的区别。
复制对象里面还有一个很重要的东西就是深拷贝和浅拷贝。
深拷贝:除了拷贝对象本身之外,对象里面所包含的属性或者对象都一起拷贝
浅拷贝:只拷贝对象本身,对象里面所包含的属性或者对象不进行拷贝。
foundation框架中支持复制的对象都是默认浅拷贝,不对对象里面的属性和对象进行拷贝。
同样,我们先举一个foundation框架中的对象来证明下它默认的是浅拷贝:
NSMutableArray *array = [[NSArray alloc] init];
for(int i=0; i&3;i++) {
NSObject *obj = [[NSObject alloc] init];
[array addObject:obj];
[obj release];
for(NSObject *obj in array){
NSLog(@" 复制之前:%d", obj.retainCount);
NSArray *array1 = [array copy];
for(NSObject *obj in array){
NSLog(@" 复制之后:%d", obj.retainCount);
程序运行之后,我们可以看出数组array在复制之前和复制之后元素的引用计数都一样,所以我们可以证明foundation框架里面的对象默认是浅拷贝的。
我们来自定义一个对象,来理解下深拷贝:
@interface Person&&
//自定义对象要支持复制,必须实现NSCopying或者是NSMutableCopying协议
@proper(nontomic, retain) NString *
@proper(nontomic, retain) NSNumber *
@implement Person
-(id)copywithzone:(NSZone*)zone {
Person *person = [[[self class] allocwithzone:zone] init];
person.name = [_name copy];
person.age = [_age copy];
-autoreleasepool
& &Person *person = [[Person
alloc] init];
&& NSLog(@"%d",
person.name.retainCount);
*person1&= [person copy];
NSLog(@"%d", person.name.retainCount);
程序执行后,发现复制前name的引用计数是1,复制后是2,对属性name进行了复制,这就是深拷贝。
好了,对对象的复制我就简单讲了这些,有什么说得不对的请你吐槽一下。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 h1z1分辨率 的文章

 

随机推荐