欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

IOS开发中的属性readwrite,readonly,retain,assign,copy,nonatomic,strong,weak.

程序员文章站 2024-01-14 22:24:52
...

1、weak 弱引用,对象释放后被置为nil,避免错误的内存访问。也就是 weak 可以在不增加对象引用计数的同时,又使得指针对象的访问是安全的。
2、nonatomic:非原子性,决定编译器生成的setter getter是否是原子操作;属性安全级别的表示,对属性赋值的时候不加锁,不加同步,多线程并发访问会提高性能。如果不加此属性则默认是两个访问方法都为原子型事务访问;貌似苹果官方推荐使用。
3、atomc:原子操作,这是默认的,在多线程的环境下,本方法设定为原子操作提供了可靠的属性存取方法,而不用担心并发时会产生问题。这也就是说,在多线程环境下,解析的访问器提供一个对属性的安全访问;
4、retain 表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的引用计数retaincount会+1;
5、readwrite 是可读可写特性;需要生成getter方法和setter方法;
6、readonly 是只读特性只会生成getter方法 不会生成setter方法,不希望属性在类外改变; 

7、assign 是赋值特性,setter方法将传入参数赋值给实例变量;仅设置变量时,assign用于简单数据类型,如NSInteger、double、bool;
8、copy:对于copy 分为:浅拷贝 和 深拷贝 ;

浅拷贝:

所谓的浅拷贝,就是指只是将对象内存地址多了一个引用,也就是说,拷贝结束后,两个对象的值不仅相同,而且对象所指的内存地址都是一样的。

深拷贝:

所谓深拷贝,就是指拷贝一个对象的具体内容,拷贝结束之后,两个对象的值虽然是相同的,但是指向的内存地址是不同的。两个对象之间也互不影响,互不干扰。

对NSstring的copy和mutableCopy

NSString *string = @"abc";
NSString *stringCopy = [string copy];
NSMutableString *stringMCopy = [string mutableCopy];
NSLog(@"string: %p, %p", string, &string);
NSLog(@"stringCopy: %p, %p", stringCopy, &stringCopy);
NSLog(@"stringMCopy: %p, %p", stringMCopy,&stringMCopy);
// 运行之后 
string: 0x1007267b8, 0x16fd95d38
stringCopy: 0x1007267b8, 0x16fd95d30
stringMCopy: 0x17027f600, 0x16fd95d28

可以看出,对NSString进行copy操作,其新对象的内存内地并没有发生改变,改变的仅是指针的地址。但是,进行mutableCopy操作,内存地址和指针地址都发生了变化。我们将内存地址发生了变化的copy操作名称之为深拷贝,反之,内存地址没有发生变化的,称之为浅拷贝。

对NSMutableString进行copy和mutableCopy

NSMutableString *string = [NSMutableString stringWithFormat:@"abc"];
NSString *stringCopy = [string copy];
NSMutableString *stringMCopy = [string mutableCopy]; 
NSLog(@"string: %p, %p", string, &string);
NSLog(@"stringCopy: %p, %p", stringCopy, &stringCopy);
NSLog(@"stringMCopy: %p, %p", stringMCopy, &stringMCopy);
// 运行之后
string: 0x17047a1c0, 0x16fd65d38
stringCopy: 0xa000000006362613, 0x16fd65d30
stringMCopy: 0x17047a200, 0x16fd65d28

对NSMutableString进行copy操作,其内存地址和指针地址都发生了变化。所以都是深拷贝,

对集合类对象的copy和mutableCopy

NSArray为例:

和NSString是一样的效果。但是,对于数组中的元素,不管是进行哪种操作,内存地址始终都没有发生变化,这个属于一个特例,我们称它为单层深拷贝。并不是理论上的完全深复制。

对NSMutableArray进行copy和mutableCopy

其内存地址都发生了变化,但是,对于数组中的元素,不管是进行哪种操作,内存地址始终都没有发生变化,所以都属于单深层拷贝

相关标签: copy weak