IOS 修饰符 详解

一、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去修饰。

三、

你可能感兴趣的:(IOS 修饰符 详解)