在作iOS以后的一段时间都是在用,也没深刻了解过某些底层具体的东西,在闲时看到了@property的深层次的性质,如今分享出来多线程
@property有三个部分布局
一、strong\weak\copy\assignatom
二、nonatomic\atomicspa
三、readonly\readwrite.net
通常是前两个,最后一个是默认的属性线程
readonly只有setter方法、readwrite同时有getter和setter方法,setter为建立时候所调用的方法,只有在使用self.的时候才会调用指针
atomic保证了原子性,即保证了setter和getter的原语性,这个为默认的状况,为了保证在多线程的状况下,编译器会自动生成互斥加锁的代码,保证同步code
nonatomic不考虑多线程的状况,不考虑互斥加锁状况,提升效率对象
通常状况下咱们是不须要多线程的,用nonatomic便可索引
用了atomic就是多线程中只有一个线程能够访问该属性,不然为nonatomic的话多个线程可同时访问该属性。
这一块是比较重要的
strong强指针,其修饰的属性通常不会自动释放(控制器销毁后自动释放)OC中,对象默认是强指针,在实际开放中通常属性对象通常用strong来修饰(NSArray,NSDictionary),在使用懒加载定义控件的时候,通常也用strong
eg:
@property (nonatomic, strong) NSArray *dataList;
@property (nonatomic, strong) UILabel *label;
懒加载控件 - (UILabel *)label { if (_label == nil) { _label = [[UILabel alloc] init]; } return _label; }
在使用 sb 或者 xib 给控件拖线的时候,属性都是用 weak 修饰,再向XIB或者sb里面添加控件时,添加的子视图是添加到跟视图View上,控制器对其跟视图View默认是强引用,当咱们的子控件添加到 view 上面的时候, self.view addSubView: 这个方法会对添加的控件进行强引用,若是在用 strong 对添加的子控件进行修饰的话,至关于有两条强指针对子控件进行强引用,为了不这种状况,因此用 weak 修饰。
addSubView 默认对其 subView 进行了强引用,在纯手码实现界面布局时,若是经过懒加载处理界面控件,须要使用strong强指针
assign:
是用来修饰基本数据类型,只是简单赋值,不更改索引计数(Reference Counting)针对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char, 等等)
copy:
copy分为深拷贝和浅拷贝和copy ,mutableCopy
浅拷贝和深拷贝都是说引用数据类型,不是说基本数据类型, 浅拷贝是说在给一个变量赋值的是将另外一个变量的引用(内存地址)赋值给新变量,而不是又从新造了一个新的东西来,深拷贝是将从新制造出一个变量的副本,而后将变量的副本赋值给新变量,
浅拷贝:指针拷贝,不产生新的对象,源对象的引用计数器+1;
深拷贝:对象拷贝,会产生新的对象,源对象的引用计数器不变;
copy:拷贝的结果是一个不可变(imutable)的对象, 不管源对象是可变的仍是不可变的,copy以后的都是不可变的类型
不可变类型 变量名 = [不可变类型|可变类型 copy];
mutableCopy:可变拷贝的结果的数据类型是一个可变的对象,不管源对象时不可变的仍是可变的,可变拷贝以后的数据类型都是可变类型
可变类型 变量名 = [不可变类型|可变类型 mutableCopy];
本质上@property (nonatomic, strong) UILabel * previousPriceLabel;
至关于声明UILabel * previousPriceLabe;而且实现setter 和getter 方法