Class

作者: 纳兰沫 | 来源:发表于2019-09-25 17:17 被阅读0次

    Class 继承自NSObject的内存结构

    1.在swift里面没有继承自NSObject的话 那么就是8个字节存放类型信息 8个字节存放引用计数 剩下的是存放他的
    属性 字节总数是16的倍数
    2.如果继承自NSObject的话 那么他的内存结构是8个字节存放类型信息 剩下的是存放属性  字节总数是16的倍数
    

    只能被Class继承的协议

    1. 协议继承自AnyObject
    2. 协议继承自Class
    3. 协议被@objc修饰 (而且被修饰之后 还可以暴露给OC去遵守实现)
    

    可选协议

    可以通过@objc 定义可选协议 这种协议只能被class 遵守实现
    
    @objc protocol Runnable {
        @objc func run1()  //run1 可选实现
        func run2()
    }
    

    dynamic

    被@objc dunamic  修饰的内容会具有动态性 比如调用方法会走runtime那一套流程
    
        @objc dynamic func test1(){
            
        }
        func test2() {
            
        }
    }
    
    var d = Dog()
    d.test1()
    d.test2()
    

    KVC/KVO

    支持KVC/KVO 但是 属性所在的类 监听器最终继承自NSObject
    

    使用@objc dunamic 修饰对应的属性 才支持KVC/KVO

    block方式的KVO

    class Person: NSObject {
        @objc dynamic var age: Int = 0
        var observation: NSKeyValueObservation?
        override init() {
            super.init()
            observation = observe(\Person.age, options: .new) {
                (person,change) in
                print(change.newValue as Any)
            }
        }
    }
    
    
    var p = Person()
    p.age = 20
    p.setValue(25, forKey: "age")
    
    Optional(20)
    Optional(25)
    

    关联对象

    class 可以使用关联对象 其他不可以
    默认情况下 extension不可以添加存储属性的 借助关联对象 可以实现类似extension为class增加存储属性的效果

    class Person: Runnable{
        
    }
    
    extension Person {
        private static var AGE_KEY: Void?//1个字节
        var age: Int {
            get{
                return (objc_getAssociatedObject(self, &Person.AGE_KEY) as? Int) ?? 0
            }
            set{
                objc_setAssociatedObject(self, &Person.AGE_KEY, newValue, .OBJC_ASSOCIATION_ASSIGN)
            }
        }
    }
    

    资源名管理

    使用枚举实现

    相关文章

      网友评论

          本文标题:Class

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