OC中用@property
声明属性时可以用assign,weak,strong,copy,retain
来修饰,这些修饰关键字都与内存管理有关。
assign
:用于修饰基本数据类型、枚举、结构体等非OC对象。起始就是简单的赋值,不会影响引用计数。如果将assign
修饰的属性强制指向一个OC对象,这并不会引起该对象引用计数的增加,这一点和weak很像。
@property (nonatomic , strong) NSArray *array;
@property (nonatomic , assign) NSInteger count;
// 将count强制指向array,虽然会有警告,但可以正常运行
self.array = [NSArray arrayWithObject:@"123"];
self.count = self.array;
weak
:弱引用,比较常用的用来修饰代理属性,这可以避免代理和被代理者之间循环引用。weak
修饰的属性指向对象时不会引起对象引用计数的变化,和assign
不同的是,当对象销毁后weak
修饰的属性会置为nil,防止野指针。
retain
和strong
:两者作用基本一样都是强引用(MRC时是用retian,现在一般用strong),当其修饰的属性(指针)指向某个对象时,是将该对象的指针拷贝一份,该对象的引用计数+1。只要有强指针指向该对象,该对象就不会被销毁。要注意的是两者在修饰block时效果是不一样的,此时strong等价于copy,而retain等价于assign(block一般应该用copy修饰)。
copy
:一般用于NSString
和block
类型上,是将整个对象拷贝一份(深拷贝),然后将指针指向新拷贝的对象,新拷贝对象引用计数为1。需要注意的是,当我们声明的属性是一个自定义对象类型时,如果用copy修饰的话,需要自定义对象遵循NSCopying
协议并实现copyWithZone
方法。
网友评论