zoukankan      html  css  js  c++  java
  • Swift & the Objective-C Runtime

    关联对象(Associated Objects)

    extension UIViewController {
        private struct AssociatedKeys {
            static var DescriptiveName = "nsh_DescriptiveName"
        }
    
        var descriptiveName: String? {
            get {
                return objc_getAssociatedObject(self, &AssociatedKeys.DescriptiveName) as? String
            }
            set {
                if let newValue = newValue {
                    objc_setAssociatedObject(
                        self,
                        &AssociatedKeys.DescriptiveName,
                        newValue as NSString?,
                        UInt(OBJC_ASSOCIATION_RETAIN_NONATOMIC)
                    )
                }
            }
        }
    }

    方法交叉(Method Swizzling)

    extension UIViewController {
        public override class func initialize() {
            struct Static {
                static var token: dispatch_once_t = 0
            }
    
            // make sure this isn't a subclass        
            if self !== UIViewController.self {
                return
            }
    
            dispatch_once(&Static.token) {
                let originalSelector = Selector("viewWillAppear:")
                let swizzledSelector = Selector("nsh_viewWillAppear:")
    
                let originalMethod = class_getInstanceMethod(self, originalSelector)
                let swizzledMethod = class_getInstanceMethod(self, swizzledSelector)
    
                let didAddMethod = class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))
    
                if didAddMethod {
                    class_replaceMethod(self, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
                } else {
                    method_exchangeImplementations(originalMethod, swizzledMethod);
                }
            }
        }
    
        // MARK: - Method Swizzling
    
        func nsh_viewWillAppear(animated: Bool) {
            self.nsh_viewWillAppear(animated)
            if let name = self.descriptiveName {
                println("viewWillAppear: (name)")
            } else {
                println("viewWillAppear: (self)")
            }
        }
    }
  • 相关阅读:
    python3监控网站状态
    暴力屏蔽80访问失败的用户
    python3爬取中国药学科学数据
    python3发邮件脚本
    OOP AOP
    lambda
    jni
    Gradle史上最详细解析
    supersocket 遇到的Failed to initialize 和 log4net用法
    在c#中利用keep-alive处理socket网络异常断开的方法
  • 原文地址:https://www.cnblogs.com/newBlash/p/4884003.html
Copyright © 2011-2022 走看看