重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
1、深拷贝就是内容拷贝,浅拷贝就是指针拷贝。本质区别在于: 是否开启新的内存地址 是否影响内存地址的引用计数 示例分析 在iOS中深拷贝与浅拷贝要更加的复杂,涉及到容器与非容器、可变与不可变对象的copy与mutableCopy。
创新互联建站主打移动网站、成都做网站、网站建设、外贸营销网站建设、网站改版、网络推广、网站维护、域名与空间、等互联网信息服务,为各行业提供服务。在技术实力的保障下,我们为客户承诺稳定,放心的服务,根据网站的内容与功能再决定采用什么样的设计。最后,要实现符合网站需求的内容、功能与设计,我们还会规划稳定安全的技术方案做保障。
2、用copy修饰的属性,在setter时,会先调用传入对象的copy方法得到一份拷贝后再retain,但不同的对象调用copy方法,可能是深拷贝也可能是浅拷贝,如果是浅拷贝,则两个指针指向一个内存,旧对象引用计数会加1。
3、浅拷贝 :指针拷贝,复制一个新的指针,只想同一块内存区域。实际内存并没有发生拷贝 深拷贝 :内容拷贝,拷贝数据到一块新内存区域,指针指向拷贝的数据区 strong: 浅拷贝,也就是指针引用,很明显的。
4、内存中存在了 两份独立对象本身。 用网上一哥们通俗的话将就是: 浅复制好比你和你的影子,你完蛋,你的影子也完蛋 深复制好比你和你的克隆人,你完蛋,你的克隆人还活着。
到这里全部真相大白了,说明我们的copy修饰的array进行了浅拷贝,我们知道只有当不可变对象使用copy时才是浅拷贝,那我们copy修饰的是一个可变数组,赋值的是一个不可变数组。
为了避免可变对象找不到方法crash,或者不可变对象被篡改,iOS中的不可变对象、容器一般都使用copy修饰符,保证setter方法中对传入的新对象调用copy方法。
block 本质上是一个OC对象,内部有个 isa 指针,可以用 retain/strong/copy 等修饰词修饰。但是 block 在创建的时候内存默认分配在栈上,而不是堆上的。
浅拷贝就是拷贝指向原来对象的指针,使原对象的引用计数+1,可以理解为创建了一个指向原对象的新指针而已,并没有创建一个全新的对象。
用copy修饰的属性,在setter时,会先调用传入对象的copy方法得到一份拷贝后再retain,但不同的对象调用copy方法,可能是深拷贝也可能是浅拷贝,如果是浅拷贝,则两个指针指向一个内存,旧对象引用计数会加1。
浅拷贝 :指针拷贝,复制一个新的指针,只想同一块内存区域。实际内存并没有发生拷贝 深拷贝 :内容拷贝,拷贝数据到一块新内存区域,指针指向拷贝的数据区 strong: 浅拷贝,也就是指针引用,很明显的。
用一句简单的话来说就是浅拷贝只是对指针的拷贝,拷贝后两个指针指向同一个内存空间,深拷贝不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针。
retain:引用计数器+1,指向同一地址。结果和浅拷贝一样,仅仅是使得对象的引用计数器自增copy:对不可变对象等同与retain,指针拷贝,引用计数器+1。对可变对象执行深拷贝,等同mutableCopy,内容拷贝。
1、到这里全部真相大白了,说明我们的copy修饰的array进行了浅拷贝,我们知道只有当不可变对象使用copy时才是浅拷贝,那我们copy修饰的是一个可变数组,赋值的是一个不可变数组。
2、通俗解释:深拷贝是内容拷贝,浅拷贝是地址拷贝 区别点:深拷贝会创建一个新的内存空间,拷贝的值是一样的,但是内存地址不一样。
3、在iOS中深拷贝与浅拷贝要更加的复杂,涉及到容器与非容器、可变与不可变对象的copy与mutableCopy。