知识梳理之@property属性

作者: 一盏盏灯 | 来源:发表于2016-07-28 09:52 被阅读166次

    一、简单介绍

    1.原子性

    atomic(默认):意为操作是原子的,当我们什么都不写的时候,默认就是这个。说明该成员变量是线程同步的。但是很少、几乎用不到,比较影响性能、效率。

    nonatomic:与atomic正好相反,意为操作是非原子的,非线程同步,基本都在使用这个。

    2.存取器控制


    readwrite(默认):意为该属性同时拥有setter 和getter。

    readonly: 意为该属性是只读的,表示只有getter没有setter。

    getter = mothod / setter = mothod:有时候为了使语义更加的明确自定义访问器名称。

    
    - (NSString *)myGetter {
              return _name;
    }
    

    还有最常见的就是BOOL类型,一般是这样写。
    例如:
    @property (nonatomic, getter = isOn) BOOL on;
    PS: setter = mothod 不常用也不推荐大家使用。

    3.内存管理


    assign(默认):属于值类型,非对象类型一般使用,如int、float、double、NSIntger、CGFloat等,表示单纯的复制。另外不存在所有权关系的对象,比如delegate也使用此关键字。
    以下两段代码是一样的:

    @property(nonatomic) int index;
    @property (nonatomic, assign)int index;
    
    • strong:能都维持对象的生命,表示实例变量对传入的对象有所有权关系,也就是强引用。
    • weak:弱引用,表示对传入的对象没有所有权,,当该对象的引用计数为0时,对象被释放后,用weak声明的实例变量指向nil。
    • copy:也就是复制或者克隆,它与strong类似,区别在于对于实例变量是对传入的对象副本拥有所有权,并非对象本身。
    • unsafe_unretained(不常用):unretained与weak类似都不会影响对象的引用计数,但是对象被释放后unretained不会指向nil.

    二、开发中的应用

    1.开发中用@property声明NSString、NSArray、NSDictionary时常常使用copy关键字,这么做达到拷贝的目的“改变原理的内容不影响副本,改变副本也不影响原来的内容”,防止如果外界修改变量时的影响。

    2.同样block作为属性是也用copy。

    3.不要将copy关键字用到NSMutableString、NSMutableArray、NSMutableDictionary等可变对象上,要用Strong关键字。</br>
    大家可以这样试试

    NSMutableArray *muArray = [NSMutableArray arrayWithObject:@“试试"];
    self.mutableArray = muArray;
    [self.mutableArray addObject:@“试试就试试"];
    

    结果程序会崩,哈哈.
    原因是,通过copy修饰的property,若通过self.someArray =来赋值初始化,则是通过系统合成setter方法实现,由于设置copy修饰词,则返回实际上是不可变数组(NSArray),当调用addObject 方法会报错。

    但是如果改成这样呢?

    @property (nonatomic, copy) NSMutableArray *mutableArray;
    NSMutableArray *muArray = [NSMutableArray arrayWithObject:@“试试"];
    _mutableArray = muArray;
    [self.mutableArray addObject:@“试试就试试"];
    

    结果会怎样呢?答:程序不会奔溃.
    原因是:
    _mutableArray是实例变量,实例变量并没有 copy 修饰,指向的仍是定义的 NSMutableArray 类型。所以即使后面通过 self. mutableArray 使用 addObject 方法仍然可行,因为初始化赋值阶段获取的是NSMutableArray类型对象,所以程序不会奔溃
    从上述可看出对于可变对象我们需要用strong关键字,就不会出现以上的情况。

    4.weak关键字常用于delegate和Qutlet

    PS:上述内容只是做个简单的介绍和使用,感兴趣的话可以往深了研究研究,挺有意思的,写这些目的就是梳理一下自己的知识,不足的地方欢迎大家指正。
    谢谢

    相关文章

      网友评论

        本文标题:知识梳理之@property属性

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