@property浅析

在做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 方法

猜你喜欢

转载自my.oschina.net/u/2986115/blog/1624316
今日推荐