@property浅析

2018-02-27 11:25:17来源:oschina作者:暮色里的夜人点击

分享

在做iOS之后的一段时间都是在用,也没深入了解过某些底层具体的东西,在闲时看到了@property的深层次的性质,现在分享出来


@property有三个部分


1、strong/weak/copy/assign


2、nonatomic/atomic


3、readonly/readwrite


一般是前两个,最后一个是默认的属性


readonly和readwrite

readonly只有setter方法、readwrite同时有getter和setter方法,setter为创建时候所调用的方法,只有在使用self.的时候才会调用


nonatomic/atomic

atomic保证了原子性,即保证了setter和getter的原语性,这个为默认的情况,为了保证在多线程的情况下,编译器会自动生成互斥加锁的代码,保证同步


nonatomic不考虑多线程的情况,不考虑互斥加锁情况,提高效率


一般情况下我们是不需要多线程的,用nonatomic即可


用了atomic就是多线程中只有一个线程可以访问该属性,否则为nonatomic的话多个线程可同时访问该属性。


strong/weak/copy/assign

这一块是比较重要的


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;
}
弱指针Weak:

在使用 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 方法

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台