知识梳理之@property属性
一、简单介绍
1.原子性
atomic(默认):意为操作是原子的,当我们什么都不写的时候,默认就是这个。说明该成员变量是线程同步的。但是很少、几乎用不到,比较影响性能、效率。
nonatomic:与atomic正好相反,意为操作是非原子的,非线程同步,基本都在使用这个。
2.存取器控制
readwrite(默认):意为该属性同时拥有setter 和getter。
readonly: 意为该属性是只读的,表示只有getter没有setter。
getter = mothod / setter = mothod:有时候为了使语义更加的明确自定义访问器名称。
- (NSString *)myGetter {
return _name;
}
还有最常见的就是BOOL类型,一般是这样写。
例如:
@property (nonatomic, getter = isOn) BOOL on;
PS: setter = mothod 不常用也不推荐大家使用。
3.内存管理
assign(默认):属于值类型,非对象类型一般使用,如int、float、double、NSIntger、CGFloat等,表示单纯的复制。另外不存在所有权关系的对象,比如delegate也使用此关键字。
以下两段代码是一样的:
@property(nonatomic) int index;
@property (nonatomic, assign)int index;
- strong:能都维持对象的生命,表示实例变量对传入的对象有所有权关系,也就是强引用。
- weak:弱引用,表示对传入的对象没有所有权,,当该对象的引用计数为0时,对象被释放后,用weak声明的实例变量指向nil。
- copy:也就是复制或者克隆,它与strong类似,区别在于对于实例变量是对传入的对象副本拥有所有权,并非对象本身。
- unsafe_unretained(不常用):unretained与weak类似都不会影响对象的引用计数,但是对象被释放后unretained不会指向nil.
二、开发中的应用
1.开发中用@property声明NSString、NSArray、NSDictionary时常常使用copy关键字,这么做达到拷贝的目的“改变原理的内容不影响副本,改变副本也不影响原来的内容”,防止如果外界修改变量时的影响。
2.同样block作为属性是也用copy。
3.不要将copy关键字用到NSMutableString、NSMutableArray、NSMutableDictionary等可变对象上,要用Strong关键字。</br>
大家可以这样试试
NSMutableArray *muArray = [NSMutableArray arrayWithObject:@“试试"];
self.mutableArray = muArray;
[self.mutableArray addObject:@“试试就试试"];
结果程序会崩,哈哈.
原因是,通过copy修饰的property,若通过self.someArray =来赋值初始化,则是通过系统合成setter方法实现,由于设置copy修饰词,则返回实际上是不可变数组(NSArray),当调用addObject 方法会报错。
但是如果改成这样呢?
@property (nonatomic, copy) NSMutableArray *mutableArray;
NSMutableArray *muArray = [NSMutableArray arrayWithObject:@“试试"];
_mutableArray = muArray;
[self.mutableArray addObject:@“试试就试试"];
结果会怎样呢?答:程序不会奔溃.
原因是:
_mutableArray是实例变量,实例变量并没有 copy 修饰,指向的仍是定义的 NSMutableArray 类型。所以即使后面通过 self. mutableArray 使用 addObject 方法仍然可行,因为初始化赋值阶段获取的是NSMutableArray类型对象,所以程序不会奔溃
从上述可看出对于可变对象我们需要用strong关键字,就不会出现以上的情况。
4.weak关键字常用于delegate和Qutlet
PS:上述内容只是做个简单的介绍和使用,感兴趣的话可以往深了研究研究,挺有意思的,写这些目的就是梳理一下自己的知识,不足的地方欢迎大家指正。
谢谢