nonatomic:非原子性访问,对属性赋值的时候不加锁,多线程并发访问会提高性能。如果不加此属性,则默认是两个访问方法都为原子型事务访问。
(atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所 以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。)

assign: 简单赋值,不更改索引计数
对基础数据类型 (例如NSInteger)和C数据类型(int, float, double, char, 等)     适用简单数据类型

copy:建立一个索引计数为1的对象,然后释放旧对象对NSString

retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1
对其他NSObject和其子类

//——————————————————————————
看了这么多也许大家有点晕, 现在进行实际的代码演示:

@property (nonatomic, assign) int number;
这里定义了一个int类型的属性, 那么这个int是简单数据类型,本身可以认为就是原子访问,所以用nonatomic,  不需要进行引用计数,所以用assign。 适用于所有简单数据类型。

@property (nonatomic, copy) NSString * myString;
这里定义了一个NSString类型的属性,不需要原子操作,所以用nonatomic.
为什么需要copy,而不是retain呢! 因为如果对myString赋值原字符串是一个可变的字符串(NSMutableString)对象的话,用retain的话,当原字符串改变的时候你的myString属性也会跟着变掉。我想你不希望看到这个现象。 实际上博主测试, 如果原来的字符串是NSString的话,也只是retain一下,并不会copy副本

@property (nonatomic, retain) UIView * myView;
这里定义了一个UIView类型的属性,不需要原子操作,所以用nonatomic.
当对myView 赋值的时候原来的UIView对象retainCount会加1

//接口文件
@interface MyClass : NSObject
@property (nonatomic, assign)   int              number;
@property (nonatomic, copy)   NSString  * myString;
@property (nonatomic, retain) UIView    * myView;
@end

//实现文件
@implementation MyClass
@synthesize number;
@synthesize myString;
@synthesize myView;

//释放内存
-(void) dealloc
{
[myString release];  //copy的属性需要release;
[myView release];    //retain的属性需要release;

[super dealloc]; //传回父对象
}

@end

假如你有一段代码创建了一个MyClass对象

MyClass * instance  = [MyClass alloc] init];

//number赋值,没什么可说的, 简单数据类型就这样
instance.number = 1;

//创建一个可变字符串
NSMutableString * string = [NSMutableString stringWithString:@"hello"];

instance.myString = string;                   //对myString赋值

[string appendString:@" world!"];      //往string追加文本

NSLog(@”%@”,string);                        //此处string已经改变, 输出为 “hello world!”

NSLog(@”%@”,instance.myString);   //输出myString,你会发现此处输出仍然为 “hello” 因为 myString在string改变之前已经copy了一份副本

UIView * view = [[UIView alloc] init];
NSLog(@”retainCount = %d”,view.retainCount);
//输出view的引用计数, 此时为1

instance.myView = view; //对myView属性赋值

NSLog(@”retainCount = %d”,view.retainCount);
//再次输出view的引用计数, 此时为2,因为myView对view进行了一次retain。

[view release];
//此处虽然view被release释放掉了,但myView对view进行了一次retain,那么myView保留的UIView的对象指针仍然有效。

[instance release] ;

Objective-C中 copy, tetain, assign , readonly , readwrite, nonatomic区别相关推荐

  1. copy, retain, assign , readonly , readwrite,strong,weak,nonatomic整理

    copy:建立一个索引计数为1的对象,然后释放旧对象 对NSString 对NSString 它指出,在赋值时使用传入值的一份拷贝.拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协 ...

  2. 【转】Objective-C 属性特性(assign , retain , copy , readonly , readwrite , atomic , nonatomic)...

    assign:指定setter方法用简单的赋值,这是默认操作.你可以对标量类型(如int)使用这个属性.你可以想象一个float,它不是一个对象,所以它不能retain.copy. assign:简单 ...

  3. retain和copy还有assign的区别

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

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

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

  5. 【C++】41. std::copy和assign的用法

    对于std::copy的用法,可以参考 https://blog.csdn.net/a_ran/article/details/17385911,我这里直接介绍对于std::vector来说std:: ...

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

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

  7. python中copy模块的使用,深拷贝和浅拷贝

    python中copy模块的使用,深拷贝和浅拷贝 文章目录: 一.copy模块的介绍 1.copy模块 二.copy模块的使用 拓展说明: 1.id( )函数的使用 2.is和== 的区别 pytho ...

  8. stl中copy()函数_std :: copy_if()函数以及C ++ STL中的示例

    stl中copy()函数 C ++ STL std :: copy_if()函数 (C++ STL std::copy_if() function) copy_if() function is a l ...

  9. stl中copy()函数_std :: rotate_copy()函数以及C ++ STL中的示例

    stl中copy()函数 C ++ STL std :: rotate_copy()函数 (C++ STL std::rotate_copy() function) rotate_copy() fun ...

  10. stl中copy()函数_std :: copy()函数以及C ++ STL中的示例

    stl中copy()函数 C ++ STL std :: copy()函数 (C++ STL std::copy() function) copy() function is a library fu ...

最新文章

  1. windows2003系列(之)搭建DHCP服务与中继代理图解
  2. thinkphp url缩短
  3. python樱花代码_使用python图形模块turtle库绘制樱花、玫瑰、圣诞树代码实例
  4. mysql修改engine_mysql下修改engine引擎的方法
  5. 【Microsoft Azure学习之旅】测试消息队列(Service Bus Queue)是否会丢消息
  6. java 双向链表_23张图!万字详解「链表」,从小白到大佬
  7. effective C++ 条款 11:在operator= 处理‘自我赋值’
  8. Hadoop群集设置
  9. excel字符处理函数
  10. linux 调节风扇速度命令,ubuntu系统调节GPU风扇转速
  11. [NLP] 中文文本相似度实战
  12. html悬浮音乐符号,简谱中常用的音乐记号
  13. java 类中 serialversionuid 作用
  14. $('xx')[0].files[0]的意思
  15. PHP 生成 csv 文件时乱码解决
  16. 结合mahout的数据挖掘算法介绍
  17. ubuntu18.04下载安装mysql 5.7 【压缩包】
  18. 直接耦合的互补输出级
  19. 发布一个iPhone版“远程桌面”
  20. 使用多线程实现多客户端的连接(通过Socket实现TCP编程)

热门文章

  1. Unique Functions in MATLAB
  2. 使用maven给jar包生成对应的pom文件
  3. 前后端分离项目中,前端请求的常见问题
  4. windows搭建SVN服务器
  5. 实习成长之路:MySQL十:怎么给字符串字段加索引?
  6. CentOS7.3系统Tomcat无法正常启动解决(8005端口不能启动)
  7. 能解决 80% 故障的排查思路
  8. ijkplayer中遇到的问题汇总
  9. window location href 手机端无法跳转_JavaScriptBOM__History_location(二十)
  10. Android页面传值b,android数据传递(一)之activityA传递到activityB