zoukankan      html  css  js  c++  java
  • 属性 与成员变量的 区别与联系 及属性修饰词理解

    成员变量和属性的区别与联系在于:

    • 成员变量是一个“内”概念,反映的是类的结构构成。属性是一个“外”概念,反映的是类的逻辑意义。
    • 成员变量没有读写权限控制,而属性可以指定为只读或只写,或可读可写。
    • 成员变量不对读出作任何后处理,不对写入作任何预处理,而属性则可以。
    • public成员变量可以视为一个可读可写、没有任何预处理或后处理的属性。 而private成员变量由于外部不可见,与属性“外”的特性不相符,所以不能视为属性。
    • 虽然大多数情况下,属性会由某个或某些成员变量来表示,但属性与成员变量没有必然的对应关系, 比如与非门的 output 属性,就没有一个所谓的 $output 成员变量与之对应。
    • 属性对成员变量扩充了存取方法 .
    • 属性默认会生成带下划线的成员变量 .
    • 早期的 Xcode 不支持自动合成成员变量的存取方法 , 所以古老的iOS工程师是愤怒的 .
    • 后来 Xcode 智能了一点 , 可以用 @synthesize 关键字自动合成成员变量的存取方法 , 此时的iOS工程师是郁闷的 .
    • 现在 Xcode 会在我们声明属性时自动合成存取方法 , 连@synthesize都不用写了 , 这样iOS工程师彻底解放了 .
    • 顺便提一下 @dynamic , 这个关键字是告诉编译器存取方法在运行时会有的 . 也可以说 @dynamic 是工程师自己来实现成员变量的存取方法 , @synthesize 是让 Xcode 帮你生成存取方法 .


    属性中的修饰词的点滴理解 :

    • assign ( ARC/MRC )

      1.这个修饰词是直接赋值的意思 , 整型/浮点型等数据类型都用这个词修饰 .
      2.如果没有使用 weak strong retain copy 修饰 , 那么默认就是使用 assign 了. ( 它们之间是有你没我的关系 )
      3.当然其实对象也可以用 assign 修饰 , 只是对象的计数器不会+1 . ( 与 strong 的区别 )
      4.如果用来修饰对象属性 , 那么当对象被销毁后指针是不会指向 nil 的 . 所以会出现野指针错误 . ( 与weak的区别 )

    • weak ( ARC )

      1.弱指针是针对对象的修饰词 , 就是说它不能修饰基本数据类型 .
      2.weak 修饰的对象计数器不会+1 , 也就是直接赋值 .
      3.弱引用是为打破循环引用而生的 .
      4.它最被人所喜欢的原因是 它所指向的对象如果被销毁 , 它会指向 nil . 而 nil 访问什么鬼都不会报野指针错误 .

    • strong ( ARC )

      1.直接赋值并且计数器 +1 .
      2.在 ARC 里替代了 retain 的作用 .

    • retain ( MRC )

      1.release 旧对象( 旧对象计数器 -1 ) , retain 新对象( 新对象计数器 +1 ) , 然后指向新对象 .
      2.在set方法里面是这样的 :

        if (_dog) {
            [_dog release];
        }
        _dog = [dog retain];
    • copy ( ARC/MRC )

      1.copy 在 MRC 时是这样做的 release 旧对象( 旧对象计数器 -1 ) , copy 新对象( 新对象计数器 +1 ) , 然后指向新对象 .(新对象是指最终指向的那个对象,不管深拷贝还是浅拷贝)
      1.1在set方法里面是这样的 :

        if (_dog) {
            [_dog release];
        }
        _dog = [dog copy];

      2.copy 在 ARC 时是这么干的 copy 新对象( 新对象计数器 +1 ) , 然后指向新对象 .
      2.1在set方法里面是这样的 :

        _dog = [dog copy];

      3.使用注意 :
      3.1 修饰的属性本身要不可变的 . 例如 NSMutableArray 采用 copy 修饰 , 添加元素表面上可以 一到运行就崩溃了 , 因为 copy 过后实际上成了NSArray了 . ( 队友 , 我们不吭你 )
      3.2 遵守 NSCopying 协议的对象使用 .

    • nonatomic ( ARC/MRC )

      1.不对set方法加锁 .
      2.性能好
      3.线程不安全

    • atomic ( ARC/MRC )

      1.原子属性就是对生成的 set 方法加互斥锁 @synchronized(锁对象) .

      @synchronized(self) {
        _delegate = delegate;
      }

      2.需要消耗系统资源 .
      3.互斥锁是利用线程同步实现的 , 意在保证同一时间只有一个线程调用 set 方法 .
      4.其实还有 get 方法 , 要是同时 set 和 get 一起调用还是会有问题的 . 所以即使用了 atomic 修饰 还是不够安全 .

    • readonly

      1.让 Xcode 只生成get方法 .
      2.不想把暴露的属性被人随便替换时 , 可以使用 .

    • readwrite

      1.让 Xcode 生成get/set方法 .
      2.不用 readonly 修饰时 , 默认就是 readwrite .

    • getter/setter 的自定义方法名 .

      1.一般对于 有/无 是/否 等这样的属性 , getter 方法名前面加个 is 会显得通俗易懂 .

      @property (nonatomic, getter = isFinish, setter = setFinish) BOOL finish;
  • 相关阅读:
    remove white space from read
    optimize the access speed of django website
    dowload image from requests
    run jupyter from command
    crawl wechat page
    python version 2.7 required which was not found in the registry windows 7
    health
    alternate rows shading using conditional formatting
    word
    【JAVA基础】static 关键字
  • 原文地址:https://www.cnblogs.com/Jenaral/p/5212158.html
Copyright © 2011-2022 走看看