仅讨论ARC环境下:
1. weak是弱引用,不会持有对象,引用计数器不会+1
常用于修饰UI控件、delegate
声明为weak的指针,weak指针指向的对象一旦被释放,weak的指针都将被赋值为nil,防止野指针。
2. strong是强引用,会持有对象,引用计数器会+1
修饰:OC对象
3.assign简单赋值,不改变引用计数。
修饰:
①基础数据类型(NSInteger、CGFloat)
②C数据类型(int、float、double、char等)
③枚举、结构体等非OC对象
4. copy分为浅拷贝、深拷贝。
修饰NSString、block
block如果不copy的话,block是存放在栈里面的,他的生命周期会随着函数的结束而出栈的,copy之后会放在堆里面。
苹果对copy的原则,苹果设定深拷贝和浅拷贝的目的就是希望帮助开发者再使用复制出来的对象时,能够不影响原对象。
总结为:
①不可变对象用copy,生成不可变对象,浅拷贝(指针拷贝)
②不可变对象用mutableCopy,生成可变对象,深拷贝(内容拷贝)
③可变对象用copy,生成不可变对象,深拷贝(内容拷贝)
④可变对象用mutableCopy,生成可变对象,深拷贝(内容拷贝)即:
对于不可变对象来说,copy是浅拷贝,mutableCopy是深拷贝。
对于可变对象来说,copy和mutableCopy都是深拷贝,但copy出来的对象是不可变的,mutableCopy出来的对象是可变的。
- 注意:自定义对象想要拥有拷贝功能,得自己遵循NSCopying方法,并重写copyWithZone方法。
-(id)copyWithZone:(NSZone *)zone
{
Car *car = [[Car allocWithZone:zone] init];
car.name = self.name;
car.speed = self.speed;
return car;
}
补充:
关于NSArray的修饰,是使用strong还是copy。
NSMutableArray使用strong修饰的。NSArray通常我也是用strong修饰的,网上看到有人说:用strong修饰NSArray,若遇到可变数组给他赋值,会出现BUG。下面看测试:
如上面代码所示,self.array1在没有直接被操作的情况下,跟随self.mArray2变化了。所以有人提出用copy修饰NSArray,如下代码:
上面代码说明copy修饰NSArray,可以解决可变数组给他赋值带来的问题。我暂时也没发现这样有什么问题,但是前面我说我通常是用strong来修饰NSArray的,下面是我处理方法:
所以说,我用strong来修饰NSArray时,遇到可变数组赋值也不会出什么问题,在不可变数组赋值的时候用copy即可。So,我感觉这是代码习惯的问题。