zoukankan      html  css  js  c++  java
  • RunTime 方法交换 NSURL 空值处理

    RunTime 消息机制

    Objective-C 扩展了 C 语言,并加入了面向对象特性和 Smalltalk 式的消息传递机制。而这个扩展的核心是一个用 C 和 编译语言 写的 Runtime 库。它是 Objective-C 面向对象和动态机制的基石。
    消息机制是运行时里面最重要的机制,OC是动态语言,本质都是发送消息,每个方法在运行时会被动态转化为消息发送,即:objc_msgSend(receiver, selector)
    RunTime 官方API
     
    NSURL 空值处理 使用runtime方法交换 :
    创建NSURL分类 在分类中直接修改URLWithString:做非空判断不可行,但是又希望URLWithString:方法能做非空处理,这个时候可以分类中创建一个新的类方法SL_URLWithString做非空处理,再通过runtime实现两个方法交换,调用系统方法URLWithString实际调用的是SL_URLWithString;
    下面是NSURL分类。
    //
    //  NSURL+url.h
    //  iOS_study00
    //
    //  Created by Datacvg on 2019/9/6.
    //  Copyright © 2019 Datacvg. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface NSURL (url)
    +(instancetype)SL_URLWithString:(NSString*)URLString;
    @end
    
    NS_ASSUME_NONNULL_END
    //
    //  NSURL+url.m
    //  iOS_study00
    //
    //  Created by Datacvg on 2019/9/6.
    //  Copyright © 2019 Datacvg. All rights reserved.
    //
    
    #import "NSURL+url.h"
    #import <objc/runtime.h>
    
    @implementation NSURL (url)
    +(void)load
    {
        /**
            在类加载方法里面使用RunTime实现方法交换(URLWithString与SL_URLWithString)
            load加载比init alloc都早
            没有使用NSURL类也会加载(程序运行就会加载)
            NSURL+url.m在Build Phases -> Compile Sources 里面原文件参与编译
         */
        //class_getInstanceMethod :获取对象方法
        //class_getClassMethod: 获取类方法
    
        Method URLWithString = class_getClassMethod([NSURL class], @selector(URLWithString:));
        Method SLURLWithString =  class_getClassMethod([NSURL class], @selector(SL_URLWithString:));
        //交换
        method_exchangeImplementations(URLWithString, SLURLWithString);
    }
    +(instancetype)SL_URLWithString:(NSString *)URLString
    {
        //方法交换后SL_URLWithStringy对应系统方法URLWithString
        NSURL * url = [NSURL SL_URLWithString:URLString];
        if (url == nil) {
            NSLog(@"url为空");
        }
        return url;
    }
    @end
     
  • 相关阅读:
    C#快速随机按行读取大型文本文件
    OpenReadWithHttps
    fiddler不能监听 localhost和 127.0.0.1的问题 .
    C#放缩、截取、合并图片并生成高质量新图的类
    JS判断只能是数字和小数点
    HTML5 Support In Visual Studio 2010
    GridView 获取列字段的几种途径
    微信朋友圈如何同时分享(图片+文字) Android版
    【Android】 PopupWindow使用小结
    Android 第三方应用接入微信平台(2)
  • 原文地址:https://www.cnblogs.com/lulushen/p/11473809.html
Copyright © 2011-2022 走看看