IOS开发中的属性readwrite,readonly,retain,assign,copy,nonatomic,strong,weak.
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
其内存地址都发生了变化,但是,对于数组中的元素,不管是进行哪种操作,内存地址始终都没有发生变化,所以都属于单深层拷贝。
下一篇: OC:传感器