iOS中深浅拷贝与copy.strong
2018-03-12 10:39
489 查看
题外:在进行创建示例工程时,忘记勾选源码托管控制。于是通过终端手动添加git源。操作过程如下
1、打开终端,将目录切换到新工程所在目录
2、输入 git init
3、输入 git add .
4、输入 git commit -m 'Initial commit'
5、重启Xcode
至此手动git源添加成功。参考链接:在Xcode中使用Git进行源码版本控制
总结,以copy修饰的属性,实现的是深拷贝即对赋值对象执行mutableCopy操作(是不是可以这样理解???)。
以下内容复制博客:http://www.jianshu.com/p/d7d7cb2043fa
关于oc深浅拷贝问题可能做过ios开发的都有了解到,尤其是面试特别喜欢问深浅拷贝的问题.但大多有点误区,即便是有几年开发经验的ios程序员来说,很少有人说到伪拷贝这个概念,而只分深浅拷贝,新开了内存就说深拷贝,只拷贝的引用就说浅拷贝,这其实是片面的理解,在这里我们一起来探究一下拷贝究竟怎么区分.
首先创建一个工程,新建一个Person类,给Person类写一个name属性,我们让Person类拥有可拷贝的特性,首先签订NSCoping协议,然后实现copyWithZone方法.代码如下:
在copyWithZone中代码如下
copyWithZone方法中代码如下:
copyWithZone方法中代码如下:
1、打开终端,将目录切换到新工程所在目录
2、输入 git init
3、输入 git add .
4、输入 git commit -m 'Initial commit'
5、重启Xcode
至此手动git源添加成功。参考链接:在Xcode中使用Git进行源码版本控制
总结,以copy修饰的属性,实现的是深拷贝即对赋值对象执行mutableCopy操作(是不是可以这样理解???)。
以下内容复制博客:http://www.jianshu.com/p/d7d7cb2043fa
关于oc深浅拷贝问题可能做过ios开发的都有了解到,尤其是面试特别喜欢问深浅拷贝的问题.但大多有点误区,即便是有几年开发经验的ios程序员来说,很少有人说到伪拷贝这个概念,而只分深浅拷贝,新开了内存就说深拷贝,只拷贝的引用就说浅拷贝,这其实是片面的理解,在这里我们一起来探究一下拷贝究竟怎么区分.
首先创建一个工程,新建一个Person类,给Person类写一个name属性,我们让Person类拥有可拷贝的特性,首先签订NSCoping协议,然后实现copyWithZone方法.代码如下:
@interface Person:NSObject<NSCopying> @property(nonatomic,retain)NSSting *name; @end1.伪拷贝--拷贝地址,相当于retain操作,造成对象引用计数+1
在copyWithZone中代码如下
- (id)copyWithZone:(NSZone *)zone { / / 伪拷贝 return [self retain]; }2.main.m文件中创建Person对象并且拷贝一个对象出来,分别打印其地址以及name属性地址,以p1,p2的引用计数.
Person *p1 = [[Person alloc] init]; p1.name = @"测试"; // 执行拷贝 Person *p2 = [p1 copy]; // 输出地址查看 NSLog(@"%p %p %p %p",p1,p2,p1.name,p2.name); // 查看 p1 p2引用计数器 NSLog(@"%ld %ld",[p1 retainCount],[p2 retainCount]);以发现p1,p2地址相同,两个name地址也相同,而引用计数为2.可见这种拷贝仅仅拷贝了一个引用然后对对象的引用计数+1,跟retain并无分别.2.浅拷贝--对象开辟新的空间,但是对象的实例变量指向同一块空间
copyWithZone方法中代码如下:
- (id)copyWithZone:(NSZone *)zone { // 浅拷贝 Person *person1 = [Person allocWithZone:zone]; person1.name = self.name; return person1; }补充:person1.name的name属性值是用strong修饰的,在进行直接赋值时,是将赋值对象的指针赋值给新变量,二者指向同一块内存,复制对象的引用计数+1,是指针拷贝。3,深拷贝--对象开辟新的空间,两个对象的实例变量也指向不同的空间。
copyWithZone方法中代码如下:
- (id)copyWithZone:(NSZone *)zone { // 深拷贝 Person *person2 = [Person allocWithZone:zone]; person2.name = [self.name mutableCopy]; return person2; }运行程序查看打印的地址信息发现,p1,p2地址不同,p1.name,p2.name地址不同,p1,p2引用计数都为1,说明现在p1,p2再没有一点瓜葛,完全是在内存中独立存在,也就是开辟新的空间,并且实例变量也指向不用的空间,这才是真正意义上的深拷贝.
相关文章推荐
- iOS strong、copy关键字之深浅拷贝
- iOS学习笔记 strong与copy 深浅复制
- iOS--copy深浅拷贝and strong
- iOS 浅谈:深.浅拷贝与copy.strong
- iOS Copy 和 MutableCopy的区别 深浅拷贝的区别
- iOS 浅谈:深.浅拷贝与copy.strong
- iOS内存管理--深、浅拷贝与copy、strong
- iOS 浅谈:深.浅拷贝与copy.strong
- iOS Copy 和 MutableCopy的区别 深浅拷贝的区别
- 【iOS开发-96】网络请求总结,深浅拷贝copy和mutableCopy,SDWebImage图像下载第三方框架
- iOS边练边学--static(作用域),copy(深浅拷贝)
- iOS 浅谈:深.浅拷贝与copy.strong
- IOS 之copy(浅拷贝)和mutableCopy(深拷贝) 以及strong 和weak理解
- ios copy和strong,浅拷贝和深拷贝
- iOS内存管理(5)--深、浅拷贝与copy、strong
- iOS 浅谈:深.浅拷贝与copy.strong
- iOS 浅谈:深.浅拷贝与copy.strong
- iOS 浅谈:深.浅拷贝与copy.strong
- IOS-10-详谈OC(object-c)深浅复制/拷贝-什么情况下用retain和copy,mutableCopy
- @proprety数组字典字符串用copy和strong区别(深浅拷贝)