美文网首页
iOS 属性特质

iOS 属性特质

作者: 温暖的弦Y | 来源:发表于2016-03-22 16:11 被阅读98次

    * assign

    设置方法只会执行针对“纯量类型” 的简单赋值操作,如CGFloat,NSInteger

    * strong

    此特质表明该属性定义了一种“拥有关系”,为这种属性设置新值时,设置方法会先保留新值,并释放旧值,然后再将新值设置上去。

    * copy

    此特质所表达的所属关系与strong类似。然而设置方法并不保留新值,而是将其‘拷贝’。当属性类型是NSString *时,经常用此特d质来保护其封装性,因为传递给设置方法的新值有可能指向一个NSMutableString类的实例,这个类是NSString的子类,表示一种可以修改其值的字符串,此时若是不拷贝字符串,那么设置完属性之后,字符串的值就可能会在对象不知情的情况下遭人更改。所以,这时就要拷贝一份“不可变”的字符串,确保对象中的字符串值不会无意间变动。

    只要实现属性所用的对象是“可变的”,就应该在设置新属性值时拷贝一份。


    Objective-C默认声明的一个对象就为__strong

    在强引用中,有时会出现循环引用的情况,这时就需要弱引用来帮忙(__weak)。

    强引用持有对象,弱引用不持有对象。

    * weak和strong 用来修饰属性如 @property (nonatomic, weak) NSString *name;

    * __weak 和 __strong 用来修饰变量


    weak 与assign 区别


    ##### @property (nonatomic, weak) id delegate;

    ##### @property (nonatomic, assign)id delegate;

    *weak 和 assign* 是一种“非拥有关系”的指针,通过这两种修饰符修饰的指针变量,都不会改变被引用对象的引用计数。但是在一个对象被释放后,weak 会自动将指针指向 nil,而 assign 则不会。 在 iOS 中,向 nil 发送消息时不会崩溃的,但是 assign 就会导致野指针的错误 unrecoginzed selector sent to instance.

    所以我们如果修饰代理属性,还是用weak 修饰吧,比较安全。


    typedef void (^selectedCell) (NSIndexPath * indedxpath);

    ##### *delegate 和 block 的选择:*

    1.多个消息传递,应该使用delegate

    2.一个委托对象的代理属性只能有一个代理对象

    3.单例对象最好不要用delegate

    单例对象由于始终都是同一个对象,如果使用delegate,就会造成我们上面说的delegate属性被重新赋值的问题,最终只能有一个对象可以正常响应代理方法。

    * ######代理更加面向过程,block则更面向结果。

    比如网络请求回来,通过success/failure 代码块来展示比较好

    * ###### 从性能上说,block的性能消耗要略大于delegate,因为block会涉及到 栈区向堆区拷贝等操作,时间和空间上的消耗都大于代理。而代理只是定义了一个方法列表,在遵守协议对象的objc_protocol_list 中添加一个节点,在运行时向遵守协议的对象发送消息即可。

    相关文章

      网友评论

          本文标题:iOS 属性特质

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