属性关键字
补充
- 关于nonatomic,如果我们能确定不需要多线程访问时,强烈推荐使用这个关键字,因为atomic对于性能的损失相对较大。
nonatomic 决定比编译器生成的setter、getter 方法是否是原子操作。如果是类的delegate,推荐使用assign关键字,原因是避免了retain的死循环造成的对象无法真正的释放
strong 、weak 补充
ARC 下新加 strong、weak
strong(默认):ARC下和MRC下retain一样
weak(ARC下):和(MRC下)assign类似,区别是当weak指向的内存释放掉后自动置为nil,防止野指针,并且weak 只对于对象而言。 对于ARC 下的基本数据类型仍旧使用 assign。
unsafe_unretained在ARC 、MRC 下都可以使用。
unsafe_unretained声明一个弱引用,但不会自动置为nil,可能会出现野指针。 (最好不要使用)
关于OC 的拷贝补充
copy 和 mutableCopy 区别?
mutable 易变的
copy就是复制了一个imutable的对象,而mutablecopy就是复制了一个mutable的对象
如果对一不可变对象复制,copy是指针复制(浅拷贝),mutableCopy就是对象复制(深拷贝)。如果是对可变对象复制,都是深拷贝,但是copy返回的对象是不可变的。
你如何看待iOS中的拷贝?
在iOS中我看到了三种拷贝方式:
(2)浅拷贝Copy:浅拷贝就是确实拷贝出来一份和原来内容一样的新对象。但是对于对象自带的属性是伪拷贝,两个对象的属性指向同一个内存。 也就是只复制指向对象的指针,而不复制引用对象本身。 拷贝出来后引用计数加 1,两者的引用计数相同,以后任意一个进行操作引用计数也会改变。
(3)深拷贝mutableCopy:深拷贝就是不仅仅拷贝出一份新对象,而且对象的属性也拷贝了一份。 也就是复制引用对象本身。 新拷贝的对象引用计数为1 ,之前的引用计数不加。 之后两者的操作互补干扰。
总的来说,如果在开发的过程中需要实现拷贝,那么需要接受NSCopying协议。实现copyWithZone:方法。浅拷贝、深拷贝的区别在于copyWithZone:方法的实现不同。
举例理解:
意思就是说我有个A对象复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一份内存资源,复制的只不过是一个指针,对象本身资源还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们复制拷贝的思想。深复制就是内存中存在了,两份独立对象本身。
用网上的通俗的话讲就是:浅复制好比你和你影子,你完蛋,你的影子也完蛋,深复制好比你和你的克隆人,你完蛋,你的克隆人还活着。
父类实现深拷贝时,子类如何实现深拷贝 ?父类没有实现深拷贝时,子类如何实现深度拷贝?
父类实现深拷贝之后,子类在重写的copyWithZone方法,先调用父类的copyWithZone方法,之后实现自己属性的拷贝。
如果父类没有实现深拷贝,子类除了需要对自己的属性进行拷贝,还要对父类的属性进行拷贝。
拷贝的setter 方法
-(void)setName:(NSString *)str
{
id t = [str copy];
[name release];
name = t;
}
copyWithZone
深拷贝
.h 文件遵循NSCopying 协议
- (id)copyWithZone:(NSZone *)zone
{
Student * stu = [[Student alloc]init];
stu.age = self.age;
stu.name = self.name;
return stu;
}
浅拷贝
- (id)copyWithZone:(NSZone *)zone
{
return [self retain];
}