美文网首页
定义Property时的那些属性

定义Property时的那些属性

作者: 西门闲话 | 来源:发表于2016-01-20 11:20 被阅读0次

    最近第一次接手了一个iOS的开发项目。通过这次项目对iOS开发中使用的Objective-C的语法有了一些初步认识。

    对于软件开发来说定义Property是必不可少的。Objective-C在定义Property的时候就有可以指定属性来修饰Property。

    整理了一下常用的大致有以下几个。

    • nonatomic
    • strong
    • weak
    • assign
    • copy

    其中常用的组合:

    // 通常声明property的似乎,都是这3种组合
    @property (nonatomic, strong) NSMutableArray *array;
    @property (nonatomic, copy) NSString *iconName;
    @property (nonatomic, assign) BOOL shouldRemind;
    
    // 但是在声明storybord的UI控件的Outlet时,也会用这种组合
    @property (nonatomic, weak) IBOutlet UITextField *textField;
    

    各种属性的说明是这样的。

    属性 说明
    nonatomic 非线性安全,与之相对应的是atomic
    strong 强引用,与之相对应的是weak
    weak 弱引用,与之相对应的是strong
    assign 简单赋值
    copy 复制赋值

    nonatomic很好理解,iOS中和UI相关的通常指定非线程安全就可以了,不过nonatomic虽然很常用,但它不是默认的属性,默认的是atomic。

    strong和weak是一对相对的属性,Xcode4还是5引入ARC(自动引用计数)来管理内存后,新添加的一对属性。其中被strong修饰的property指向一个对象后,会触发该对象的ARC自加,同样当着这个property被设成nil后,该对象的ARC会自减;被weak修饰的property指向一个对象时,不会触发该对象的ARC自加,相对的被设成nil后,该对象的ARC也不会自减,同样当该对象的ARC归零后被会系统回收后,weak修饰的property也会自动被设成nil。

    最后就是assign和copy其实还有一个retain,关于这组修饰用的属性,涉及到property实现的。

    @interface NewClass ()
    // 通常我们是向下下面一样定义property
    @property (nonatomic, copy) NSString *propertyName
    @end
    
    @implementation AllListsViewController {
        NSString *_propertyNewName;
    }
    // 当然我们也可以这么定义property
    @synthesize propertyNewName = _propertyNewName;
    
    // getter
    - (NSString *) propertyNewName {
        return _propertyNewName
    }
    
    // setter
    - (void) setPropertyNewName:(NSString *)propertyNewName {
       // 暂留
    }
    @end
    

    而这3个修饰用的属性的区别就在setter里面

    • assgin就是指直接复制
    - (void) setPropertyNewName:(NSString *)propertyNewName {
       // assign是大概这个样子的。
       _propertyNewName = propertyNewName;
    }
    
    • copy则是先release,然后再用参数的值copy了。
    - (void) setPropertyNewName:(NSString *)propertyNewName {
         // copy是大概这个样子的。
         [_propertyNewName release];
         _propertyNewName = [propertyNewName copy];
    }
    
    • retain和copy很像。只不过是用参数值的retain函数
    - (void) setPropertyNewName:(NSString *)propertyNewName {
         // copy是大概这个样子的。
         [_propertyNewName release];
         _propertyNewName = [propertyNewName retain];
    }
    

    以上就是几个常用的来修饰property的属性,初次之外还有readonly和readwrite这两个,顾名思义这两个属性就是控制property的读写权限的。

    相关文章

      网友评论

          本文标题:定义Property时的那些属性

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