passing copy week strong
2015-10-28 10:59
162 查看
#synthesize关键字:
根据@property设置,自动生成成员变量相应的存取方法,从而可以使用点操作符来方便的存取该成员变量
。
property关键字:设置成员变量的属性(有读/写,赋值assign,retain,copy ,以及对多线程的支持nonatomic)。
使用@property配合@synthesize可以让编译器自动实现getter/setter方法,使用的时候也很方便,可以直接使用“对象.属性”的方法调用;如果我们想要”对象.方法“的方式来调用一个方法并获取到方法的返回值,那就需要使用@property配合@dynamic了
使用@dynamic关键字是告诉编译器由我们自己来实现访问方法。如果使用的是@synthesize,那么这个工作编译器就会帮你实现了。
readonly此标记说明属性是只读的,默认的标记是读写,如果你指定了只读,在@implementation中只需要一个读取器。或者如果你使用@synthesize关键字,也是有读取器方法被解析。而且如果你试图使用点操作符为属性赋值,你将得到一个编译错误。
readwrite此标记说明属性会被当成读写的,这也是默认属性。设置器和读取器都需要在@implementation中实现。如果使用@synthesize关键字,读取器和设置器都会被解析。
nonatomic:非原子性访问,对属性赋值的时候不加锁,多线程并发访问会提高性能。如果不加此属性,则默认是两个访问方法都为原子型事务访问。
atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。
assign: 简单赋值,不更改索引计数
对基础数据类型
(例如NSInteger,CGFloat)和C数据类型(int, float, double, char,
等)
适用简单数据类型
copy:建立一个索引计数为1的对象,然后释放旧对象
retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1(retain会增加对象的引用计数,而基本数据类型或者Core Foundation对象都没有引用计数)
copy与retain:
Copy其实是建立了一个相同的对象,而retain不是:
比如一个NSString对象,地址为0×1111,内容为@”STR”
Copy到另外一个NSString之后,地址为0×2222,内容相同,新的对象retain为1,旧有对象没有变化
retain到另外一个NSString之后,地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1
也就是说,retain是指针拷贝,copy是内容拷贝
retain的set方法应该是浅复制,copy的set方法应该是深复制了
copy另一个用法:
copy是内容的拷贝 ,对于像NSString,的确是这样.
但是,如果是copy的是一个NSArray呢?比如,
NSArray *array = [NSArray arrayWithObjects:@"hello",@"world",@"baby"];
NSArray *array2 = [array copy];
这个时候,,系统的确是为array2开辟了一块内存空间,但是我们要认识到的是,array2中的每个元素,,只是copy了指向array中相对应元素的指针.这便是所谓的"浅复制".
assign与retain assign引用计数不加一 retain引用计数加一
strong
强引用,ARC模式下与retain同作用,对象的retaincount自动加1
week
弱引用,ARC模式下与assign同作用,非对象类型使用。
根据@property设置,自动生成成员变量相应的存取方法,从而可以使用点操作符来方便的存取该成员变量
。
property关键字:设置成员变量的属性(有读/写,赋值assign,retain,copy ,以及对多线程的支持nonatomic)。
使用@property配合@synthesize可以让编译器自动实现getter/setter方法,使用的时候也很方便,可以直接使用“对象.属性”的方法调用;如果我们想要”对象.方法“的方式来调用一个方法并获取到方法的返回值,那就需要使用@property配合@dynamic了
使用@dynamic关键字是告诉编译器由我们自己来实现访问方法。如果使用的是@synthesize,那么这个工作编译器就会帮你实现了。
readonly此标记说明属性是只读的,默认的标记是读写,如果你指定了只读,在@implementation中只需要一个读取器。或者如果你使用@synthesize关键字,也是有读取器方法被解析。而且如果你试图使用点操作符为属性赋值,你将得到一个编译错误。
readwrite此标记说明属性会被当成读写的,这也是默认属性。设置器和读取器都需要在@implementation中实现。如果使用@synthesize关键字,读取器和设置器都会被解析。
nonatomic:非原子性访问,对属性赋值的时候不加锁,多线程并发访问会提高性能。如果不加此属性,则默认是两个访问方法都为原子型事务访问。
atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。
assign: 简单赋值,不更改索引计数
对基础数据类型
(例如NSInteger,CGFloat)和C数据类型(int, float, double, char,
等)
适用简单数据类型
copy:建立一个索引计数为1的对象,然后释放旧对象
retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1(retain会增加对象的引用计数,而基本数据类型或者Core Foundation对象都没有引用计数)
copy与retain:
Copy其实是建立了一个相同的对象,而retain不是:
比如一个NSString对象,地址为0×1111,内容为@”STR”
Copy到另外一个NSString之后,地址为0×2222,内容相同,新的对象retain为1,旧有对象没有变化
retain到另外一个NSString之后,地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1
也就是说,retain是指针拷贝,copy是内容拷贝
retain的set方法应该是浅复制,copy的set方法应该是深复制了
copy另一个用法:
copy是内容的拷贝 ,对于像NSString,的确是这样.
但是,如果是copy的是一个NSArray呢?比如,
NSArray *array = [NSArray arrayWithObjects:@"hello",@"world",@"baby"];
NSArray *array2 = [array copy];
这个时候,,系统的确是为array2开辟了一块内存空间,但是我们要认识到的是,array2中的每个元素,,只是copy了指向array中相对应元素的指针.这便是所谓的"浅复制".
assign与retain assign引用计数不加一 retain引用计数加一
strong
强引用,ARC模式下与retain同作用,对象的retaincount自动加1
week
弱引用,ARC模式下与assign同作用,非对象类型使用。
相关文章推荐
- 703n路由器 刷openwrt 修改 串口双向传输和串口波特率
- Linux的特殊文件系统-----
- Windows Display Driver Model (WDDM) Operation Flow
- 安装完CentOS 7 后必做的七件事[转]
- 在Linux下使用GIMP打印一寸照
- linux的基础(转)
- OpenCV经常会出现一些内存泄露问题
- where top1000(X)<=10等条件谓词提前问题记录
- Android ,在争议中逃离 Linux 内核的 GPL 约束
- Linux下Wireshark的网络抓包使用方法
- Hadoop 设置任务执行的队列以及优先级和其他 配置
- linux下批量修改文件名
- 改变apache路径规则来实现隐藏真实路径
- AllowOverride以及Options相关指令
- Windows下Nginx+Tomcat整合的安装与配置
- Linux文本命令集锦
- Hadoop Streaming使用简介
- Hadoop读写文件时内部工作机制是怎样的?
- 8.5.4 Optimizing InnoDB Redo Logging 优化InnoDB Redo Logging
- 采用PopupWin控制消息推送功能