我们列举几个主要的属性修饰符:
- 线程安全类:nonatomic/atomic?
- 读写权限类:readonly/readwrite
- 内存管理类:assign/weak/strong/copy
线程安全类:nonatomic/atomic
- nonatomic 非原子属性。它的特点是多线程并发访问性能高,但是访问不安全;
- atomic,特点就是安全但是是以耗费系统资源为代价,所以一般在工程开发中用nonatomic的时候比较多。
- 系统默认的是atomic,为setter和getter方法加锁,而nonatomic 则不会。
?有关nonatomic和atomic的详细内容移步:从atomic关键字说到多线程安全(内含iOS给代码加锁方法总结)_咚个里个呛的博客-CSDN博客
?
读写权限类:readwrite/readonly
这个就是访问权限的控制,决定该属性是否可读和可写,默认是readwrite ,所以我们定义属性的时候,一般不需要这个修饰。只有只读属性才需要加上readonly 的修饰。
readonly 来控制读写权限的方式就是只生成getter方法,不生成setter方法。
内存管理类:assign/weak/strong/copy
这部分属于很常用也很容易弄混的几个修饰符,属于oc的基础。
1,assign
- 在MRC和ARC下都可以使用。
- 一般用来修饰OC基础数据类型(NSInteger,CGFloat等)和C的数据类型(int,float等)。
- assign修饰的对象,在引用计数为0时不会将对象置为nil。
2,weak
- weak 表示对对象的弱引用,被weak修饰的对象随时可被系统销毁和回收。
- 用weak修饰弱引用,不会使传入对象的引用计数加1。
注意事项
assign和weak的区别:当它们指向的对象释放后,assign指向的对象不会被置为nil,weak的则会。
3,strong
- strong表示对对象的强引用
- ARC下可以用来修饰block,在属性修饰词中strong和weak默认的为strong。
- 用于指针变量时,赋值后先release旧值再retain新值。
?strong修饰的属性为强引用,对象的引用计数会+1。
strong同时也要注意两个对象之间的循环引用,内存泄漏问题。
4,copy
在讨论copy前,我们先了解一下什么是浅拷贝和深拷贝。
浅拷贝:浅拷贝只复制对象本身,而不会复制对象引用的其他对象,拷贝出来的对象与源对象的地址不一样。
深拷贝:深拷贝除了复制对象本身,还会复制对象所引用的其他对象,拷贝出来的对象与源对象的地址一样。
- 一般情况下,copy用于对不可变容易的属性修饰中,主要是NSArray /NSDictionary/NSString, 也可以用来修饰block。
- 在MRC和ARC下都可以使用。
- 其setter方法,与retain处理流程一样,先旧值release,再copy出新的对象。
注意事项
首先最需要关注的就是copy的深浅拷贝,?篇幅很多详细可在这篇文章中查看:OC-copy、深拷贝和浅拷贝的理解_lyz0925的博客-CSDN博客
然后就是copy修饰的setter方法。
-(void)setName: (id)name {
if (_name != name) {
[_name release];
_name = [name copy];
}
}
另外就是,copy拷贝的对象是存在堆中的?
?什么时候用到深浅复制呢?
这是我从网上找的例子,应该能帮助更好的理解深浅复制!
那么先让我们来看一看下边数组类型的转换
1、不可变对象→可变对象的转换:
???????NSArray?*array1= [NSArray arrayWithObjects:@"a",@"b",@"c",@"d",nil];
???????NSMutableArray??*str2=[array1?mutableCopy];
2、可变对象→不可变对象的转换:
????NSMutableArray?*array2 ??= [NSMutableArray?arrayWithObjects:@"aa",@"bb",@"cc",@"dd",nil];
???????NSArray?*array1=[??array2 ???Copy];
3、可变对象→可变对象的转换(不同指针变量指向不同的内存地址):
???????NSMutableArray?*array1= [NSMutableArray?arrayWithObjects:@"a",@"b",@"c",@"d",nil];
???????NSMutableArray??*str2=[array1?mutableCopy];
通过上边的两个例子,我们可轻松的将一个对象在可变和不可变之间转换,并且这里不用考虑内存使用原则(即引用计数的问题)。没错,这就是深拷贝的魅力了。
4、同类型对象之间的指针复制(不同指针变量指向同一块内存地址):
??a、
???NSMutableString?*str1=[NSMutableString?stringWithString:@"two day"];
???NSMutableString?*str2=[str1 ??retain];
???[str1 ?release];
??b、
???NSArray?*array1= [NSArray arrayWithObjects:@"a",@"b",@"c",@"d",nil];
???NSArray??*str2=[array1?Copy];
???[array1 release];
???通俗的讲,多个指针同时指向同一块内存区域,那么这些个指针同时拥有对该内存区的所有权。所有权的瓜分过程,这时候就要用到浅拷贝了。
有关更详细的copy修饰符,我找到了一个非常详细的博客:OC中的copy - 简书
有感兴趣的可以在这篇文章中再进行好好学习。
|