在过去的三周面试了20个iOS程序员,只有几个应聘者回答对了这道面试题,没有完整回答对,只回答对了一半,没有一个应聘者给出完整的答案!!!
这道面试题就是深浅拷贝
大多数面试者都会回答出浅拷贝是指针拷贝没有开辟了新的内存空间,深拷贝是内容拷贝并开辟了新的内存空间然后结没下文了。
然后我给出了这道题
NSString*str1=@"str1";
NSString*str2=[str1 copy];
str1 = @"test";
str1的值改变时str2的值会不会改变?大部分面试者都回答str2的值会改变
无论是3年还是5年 、6年、7年、8年的开发者干脆利落的回答错误
copy有它的特点:
修改源对象的属性和行为,不会影响副本对象
修改副本对象的属性和行为,不会影响源对象
NSLog(@"\nstr1 = %@ str1P = %p \n str2 = %@ str2P = %p",str1,str1,str2,str2);/*输出结果,修改str2 同理
str1 = asdf str1P = 0x10776b1a0
str2 = str1 str2P = 0x10776b180
那么NSString *str2 = [str1 copy];是不同的指针指向同一块内存空间,str1从新赋值后两个内存空间就不一样了呢?
因为str2 = str1的时候,两个字符串都是不可变的,指向的同一块内存空间中的@"str1",是不可能变成@"test"的。所以这个时候,为了优化性能,系统没必要另外提供内存,只生成另外一个指针,指向同一块内存空间就行。
但是当你从新给str1或者str2赋值的时候,因为之前的内容不可变,还有互不影响的原则下,这个时候,系统会从新开辟一块内存空间。
最后
字符串的浅拷贝内存地址没有变化,只改变指针地址 ,深拷贝开辟新的内存空间,内存地址改变,指针地址改变
不可变对象的copy只是指针的改变,深拷贝都是内容复制,内存地址改变,指针地址改变,但是对象内部的元素的地址不变
对于不可变的集合类对象进行 copy 操作,只是改变了指针,其内存地址并没有发生变化;进行 mutableCopy 操作,内存地址发生了变化,但是其中的元素内存地址并没有发生变化。
对于可变集合类对象,不管是进行 copy 操作还是 mutableCopy 操作,其内存地址,指针地址都发生了变化,但是其中的元素内存地址都没有发生变化,属于单层深拷贝。
多说一点
不论多难做的事情,只要你开始行动,困难总会一个一个慢慢化解。然后你会发现,不管什么目标,总会有到达的那天。当你决定出发并且为之付诸实践的时候,最困难的那部分就已经完成了。这个世界人潮拥挤,请给自己的生活多点信心,照顾好自己,你要逼自己优秀,优于过去的自己。每一个华丽的转身,背后都有不为人知的心酸,外表的光鲜亮丽,背后心情汗水与辛劳付出,一分耕耘,一分收获,羡慕别人,不如战胜自己。