一、readOnly,readWrite
readeonly, “只读”只生成getter方法 而没有生成setter方法 这时候如果调用setter方法会 报一个Assignment to readonly property的错误 但是这里可以使用keyValue(kvc)的方法修改
代码如下
@interfaceMyFirstClass:NSObject
@property(nonatomic,copy,readonly)NSString* string;
@end
#import"MyFirstClass.h"
@implementationMyFirstClass
- (instancetype) init{
self= [superinit];
if(self) {
_string =@"我会被改变吗";
}
returnself;
}
@end
- (void)viewDidLoad {
[superviewDidLoad];
MyFirstClass *class= [MyFirstClass new];
NSLog(@"string === %@",class.string);
[classsetValue:@"改变了"forKey:NSStringFromSelector(@selector(string))];
NSLog(@"string === %@",class.string);
}
Log如下:
2018-03-1611:08:58.932303+0800PropertyDesc[5681:445705] string === 我会被改变吗
2018-03-1611:08:58.932454+0800PropertyDesc[5681:445705] string === 改变了
readWrite
读写属性 生成setter方法和getter方法
二、atomic nonatomic
atomic
默认属性修饰词 按照官方文档说 即使是从不同线程去setter或者getter都能完全的获取到或者设置值,从这里也可以看出 它并不是线程安全的 因为如果a线程在getter值 但是b、c线程在setter 这时agetter到的值可能是b、c线程setter之后的值 也可能是setter之前的值
nonatomic
并没有做锁的操作 多线程同时进行setter/getter操作,并不能保证得到一个完整的value,所以相对atomic来说nonatomic修饰的属性访问速度更快,而且平时对线程安全我们更倾向于使用信号量、NSLock和synchronized去控制线程安全,他们都能保证代码块的原子性,所以几乎所有的属性都用nonatomic去修饰。
三、
网友评论