美文网首页
@property浅析

@property浅析

作者: 海笙樾 | 来源:发表于2018-03-22 14:29 被阅读0次

    在做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 = [[UILabelalloc] 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 方法

    相关文章

      网友评论

          本文标题:@property浅析

          本文链接:https://www.haomeiwen.com/subject/yceaqftx.html