今天是我第一次在简书发布文章,我也是一个iOS开发的小白,从接触iOS开发到现在已经有一年的时间了,今年毕业了,目前在一家我喜欢的公司作为实习生。终于可以真正意义在工作中实践iOS开发了(之前在一家公司实习过两个月左右,但是个人认为没有意义),还是很激动,同时也想将自己知道的和学习到的知识与大家分享(我是多么地无私),分享的对大神来说都是基础中的基础,嗤之以鼻,但是我的目的是做笔记,也给我与一个水平的小伙伴们能看懂的知识点,所以大神们可以随意吐槽,指出不足,随意地鞭策我,让我涨姿势!
今天的笔记是在属性声明中使用copy的原因。接触iOS开发的同学们都知道在声明NSString类型的属性时需要用copy修饰,但是不一定知道原因。
首先,要了解“深拷贝”和“浅拷贝”两个概念,我们都知道在创建一个对象时,实际上是在内存中开辟出了一块内存来存储对象同时创建一个指针指向该对象作为持有者。
“浅拷贝”:拷贝,顾名思义就是将某个东西复制一份(废话)。而拷贝的深度不一样,“浅拷贝”只是拷贝了指向对象的指针,拷贝后的结果是两个不同的指针指向同一个对象,那么对象中的值发生改变,无论通过哪一个指针取出对象,对象中的值都是不变的。拷贝的不彻底嘛!
“深拷贝”:与“浅拷贝”不同,它会将对象和指针都拷贝出来,拷贝后的结果就是两个不同的个体了。就像是双胞胎,长得一样,性格却不同,明显不是一个人,当然媳妇肯定也不一样,其中一个不在人世了,另一个仍然可以活的逍遥自在。其中任何一个对象的改变都不会改变另外一个。
下面NSString来直观地看一下两者的区别,上代码:
“浅拷贝”:
@property (nonatomic, strong) NSString *string;
NSMutableString*tempString = [NSMutableString WithString:@"哈哈"];
self.string= strtempString;
[tempString setString:@"哼哼"];
此时string的值是“哼哼”。
“深拷贝”:
@property(nonatomic,copy)NSString *string;
同样执行上面的代码,string的值就是“哈哈”。
网友评论