属性的特性:copy和retain的区别

1. 属性特性retain和copy的对比:

@intertace Possession : NSObject

{

NSString *_possessionName;

NSString *_possessionClass;

}

//我们分别将两个属性设置成不同的特性,一个为retain, 一个为copy,这样为了做个对照。

@property (nonatomic, retain) NSString *possessionName;

@property (nonatomic, copy) NSString *possessionClass;

在生成的存方法中是这样的:

- (void)setPossessionName:(NSString *) possessionName

{

[possessionName retain];  //保留一份入参,这时候possessionName的ratain计数加1。

[_possessionName release]; //担心有一种情况出现(<1>标注),所以事先对实例变量进行释放,然后再做新的引用。

_possessionName = possessionName; //这时候 _possessionName和possessionName指向了一个地址(也就是一个对象

参数possessionName改变的时候,实例变量也会改变)

}

- (void)setPossessionClass:(NSString *) possessionClass

{

[_possessionClass release]; //担心有一种情况出现(<1>标注),所以事先对实例变量进行释放,然后再做新的引用。

_possessionClass = [possessionClass copy];

//这时候 _possessionName和possessionName指向的是不同的地址(也就是不同的对象),所以即使对入参进行改变,也不会引起实例变量的改变。

}

测试我们的结论:

//生成一个实例

Possession *p = [[Possession alloc] init];

NSMutableString *string = [NSMutableString stringWithString:@"Hello"];

[p setPossessionName:string];

[p setPossessionClass:string];

NSLog(@"%@,%@",p.possessionName,p.possessionClass);

//对string就行更改

[string appendString:@",World"];

//再打印一次

NSLog(@"%@,%@",p.possessionName,p.possessionClass);

这样两次打印的结果会让你明白copy和retain两个特性的明显区别

打印结果如下:

Hello,Hello

Hello,World,Hello

很明显:被加以retain特性的类属性,在外界参数改变的情况下它也随之改变,说明是共用了一块内存;

而加以copy特性的类属性,在外界参数改变的情况下它并没有随之改变,说明它只是copy了一份一模一样的内存内容。

得出的结论是:

如果属性的类型是可修改的子类(即该类的实例是可修改的),那么通常情况下,该属性应该有copy特性,而不是retain特性。

这样,类实例就可以拥有一份相应对象的完全独立的备份。

注:

<1> Possession *p = [[Possession alloc] init];

[p setPossessionName:@"Red"];

//接下来马上又赋一次值

[p setPossessionName:@"Black"];

这样的话实例变量指向@"Red"对象的引用还在,而又指向了@"Black"对象,而之前的引用不能被释放,这就造成了内存的泄露。

copy和retain的区别相关推荐

  1. object-c语言的nonatomic,assign,copy,retain的区别

    nonatomic: 非原子性访问,不加同步,多线程并发访问会提高性能.如果不加此属性,则默认是两个访问方法都为原子型事务访问.                     (atomic是Objc使用的 ...

  2. nonatomic,assign,copy,retain的区别

    nonatomic:非原子性访问,不加同步,多线程并发访问会提高性能.如果不加此属性,则默认是两个访问方法都为原子型事务访问.                     (atomic是Objc使用的一 ...

  3. c语言assign用法,object-c语言的nonatomic,assign,copy,retain的区别

    nonatomic: 非原子性访问,不加同步,多线程并发访问会提高性能.如果不加此属性,则默认是两个访问方法都为原子型事务访问. (atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写 ...

  4. Copy与Retain的区别

    Copy与Retain的区别: copy是创建一个新对象,retain是创建一个指针,引用对象计数加1.Copy属性表示两个对象内容相同,新的对象retainCount为1,与旧有对象的引用计数无关, ...

  5. iOS属性之assign,copy,retain的区别以及weak和strong的区别

    为什么80%的码农都做不了架构师?>>>    @property (nonatomic, assign) NSString *title; 什么是assign,copy,retai ...

  6. atomic与nonatomic,assign,copy与retain的定义和区别

    atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作. atomic 设置成员变量的@property属性时,默认为atomic,提供多线程安全. 在多线程环境 ...

  7. retain和copy还有assign的区别

    retain和copy还有assign的区别 1. 假设你用malloc分配了一块内存,并且把它的地址赋值给了指针a,后来你希望指针b也共享这块内存,于是你又把a赋值给(assign)了b.此时a和b ...

  8. 【iOS atomic、nonatomic、assign、copy、retain、weak、strong】的定义和区别详解

    一.atomic与nonatomic 1.相同点 都是为对象添加get和set方法 2.不同点 atomic为get方法加了一把安全锁(及原子锁),使得方法get线程安全,执行效率慢 nonatomi ...

  9. IOS atomic与nonatomic,assign,copy与retain的定义和区别

    atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作.         atomic 设置成员变量的@property属性时,默认为atomic,提供多线程安全 ...

最新文章

  1. Android 微信支付详解与Demo
  2. linux下java写ftp服务器端,在Linux下部署网站(java环境部署)第五章 FTP服务器搭建...
  3. Linux 打印可变参数日志
  4. 信息学奥赛一本通 1405:质数的和与积 | OpenJudge NOI 2.1 7827:质数的和与积 | 小学奥数 7827
  5. Windows Mobile 系列文章索引---不断整理中(2009-07-08)
  6. 关于MySql的1146错误修正
  7. 根据用户查进程_Linux进程之如何查看进程详情?
  8. 矩池云如何使用 conda create 创建纯净的 Python3.6 环境?
  9. 2017ACM/ICPC广西邀请赛题解
  10. deepfake 资源总结
  11. d3.js——饼状图
  12. java 如何执行dig 命令_如何直接在cmd下执行Dig命令
  13. 基于 WebGL 3D 的 HTML5档案馆可视化管理系统
  14. 如何压缩动态图片大小?gif图太大了怎么压缩?
  15. Matplotlib 矢量场(quiver)
  16. 语义分割(三)Unet++
  17. system()函数详解
  18. 机器学习指南_机器学习项目的研究指南
  19. ping 丢包 网络摄像头_网络摄像机频繁掉线的处理方法
  20. phpstorm默认注释在行开头

热门文章

  1. 跟着知识追寻者学BeautifulSoup,你学不会打不还口,骂不还手
  2. 电脑强制打开手机usb调试_如何设置安卓手机各版本USB调试模式
  3. 7-2 jmu-ds-最长数字序列 (20 分)
  4. linux子程序标识符,linux过程标识符详解1
  5. docker开放的端口_Docker 开启2375端口,提供外部访问docker
  6. 电脑如何查看ip地址和路由器网关? 查看网关ip地址的方法
  7. 好工具推荐系列:MacOS中MacPorts安装和使用(含qt4-mac的教程)
  8. 安装AdventureWorks2008后没有AdventureWorks2008数据库的解决办法
  9. Cadence初次使用
  10. shutdown定时关机和定时重启命令