最后更新: 2017-06-21


一、文件结构

二、KMSwizzle

KMSwizzle主要就一个方法交换的代码

2.1 class_getInstanceMethod()

获取某个类实例的方法, 如果该类实例没有此方法, 则返回NULL

Method swizzleMethod = class_getInstanceMethod([Person class], @selector(run));
if (swizzleMethod == NULL) {
NSLog(@"NULL");
}

参数解释

class_getInstanceMethod(Class cls, SEL name)

cls: 获取方法的类

name: 方法的名称

2.2 class_addMethod()

参数解释

BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types)

cls: 获取方法的类

name: 添加的方法方法的名称

imp: 方法的实现,也就一个指向方法的指针

const char *types: 定义了返回值类型和参数类型的字符串(下面会提到)

返回值

YES: 增加方法成功

NO: 增加方法失败,例如 (如果目标类(Person) 实现了该方法,那么会返回 NO)

git 有提交讨论这个问题

注意点

  • class_addMethod 能够覆盖父类的实现的, 如果目标类有实现了该方法,class_addMethod就会失败,调用该方法,会调用到目标类的方法

class_addMethod will add an override of a superclass's implementation

  • 分支-处理警告问题

    参考: https://stackoverflow.com/questions/6224976/how-to-get-rid-of-the-undeclared-selector-warning

    void sayHello(id self, SEL _cmd, NSString *word)
    {
    NSLog(@"%@", word);
    } - (void)viewDidLoad {
    [super viewDidLoad]; #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Wundeclared-selector"
    class_addMethod([Person class], @selector(resolveThisMethodDynamically:), (IMP)sayHello, "v@:@");
    Person *p = [[Person alloc] init];
    [p performSelector:@selector(resolveThisMethodDynamically:) withObject:@"hello"];
    #pragma clang diagnostic pop }
  • 需要动态调用,因为通过运行时添加的方法,直接调用 编译不过的

    正确做法:
    [p performSelector:@selector(resolveThisMethodDynamically:) withObject:@"hello"]; 错误做法,编译不过
    [p resolveThisMethodDynamically:@"hello"];
  • imp 默认自带两个参数, id类型 以及 SEL 类型

    void sayHello(id self, SEL _cmd, ...)

2.3 参数 const char *types 解释

v 表示的是void 类型

i 表示整数类型

@ 表示一个对象

: 表示一个方法

v@: 表示的是返回值类型是void, 一个参数是对象(id self),另一个参数为方法 (SEL _cmd)

v@

iOS-KMNavigationBarTransition 框架学习的更多相关文章

  1. iOS学习——iOS 整体框架及类继承框架图

    整理自:IOS 整体框架类图值得收藏 一 整体框架 在iOS开发过程中,对iOS的整理框架的了解和学习是必不可少的一个环节,今天我们就好好来了解一下iOS的整体框架.首先贴一个关于iOS的框架介绍:i ...

  2. 够快网盘支持与iOS-ASIHTTPRequest框架学习

    够快网盘支持与iOS-ASIHTTPRequest框架学习 前段时间在公司的产品中支持了够快网盘,用于云盘存储. 在这个过程中,学习到了很多新的知识,也遇到了很多问题,在此记录一下. 首先就够快的AP ...

  3. 移动开发iOS&Android对比学习--异步处理

    在移动开发里很多时候需要用到异步处理.Android的主线程如果等待超过一定时间的时候直接出现ANR(对不熟悉Android的朋友这里需要解释一下什么叫ANR.ANR就是Application Not ...

  4. 关于iOS开发的学习

    关于iOS开发的学习,打个比方就像把汽车分解:    最底层的原料有塑料,钢铁    再用这些底层的东西造出来发动机,座椅    最后再加上写螺丝,胶水等,把汽车就拼起来了 iOS基本都是英文的资料, ...

  5. 详解OS X和iOS图像处理框架Core Image

    转自:http://www.csdn.net/article/2015-02-13/2823961-core-image 摘要:本 文结合实例详解了OS X和iOS图像处理框架Core Image的使 ...

  6. iOS常用框架源码分析

    SDWebImage NSCache 类似可变字典,线程安全,使用可变字典自定义实现缓存时需要考虑加锁和释放锁 在内存不足时NSCache会自动释放存储的对象,不需要手动干预 NSCache的key不 ...

  7. IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API

    IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习之保护API. 使用IdentityServer4 来实现使用客户端凭据保护ASP.N ...

  8. Hadoop学习笔记—18.Sqoop框架学习

    一.Sqoop基础:连接关系型数据库与Hadoop的桥梁 1.1 Sqoop的基本概念 Hadoop正成为企业用于大数据分析的最热门选择,但想将你的数据移植过去并不容易.Apache Sqoop正在加 ...

  9. 又一个高性能轻量级的iOS模型框架YYModel

    前言 iOS的模型框架其实有很多了,去年研究过Mantle,也了解过JSONModel.MJExtension,最近的项目项目优化的时候,再次考虑,基于轻量级.高性能的考虑,最终选择了YYModel. ...

  10. Spring框架学习一

    Spring框架学习,转自http://blog.csdn.net/lishuangzhe7047/article/details/20740209 Spring框架学习(一) 1.什么是Spring ...

随机推荐

  1. 剑指Offer编程题(Java实现)——反转链表

    题目描述 输入一个链表,反转链表后,输出新链表的表头. 思路一 使用头插法迭代进行反转 实现 /* public class ListNode { int val; ListNode next = n ...

  2. Bootstrap字体图标Font-Awesome 使用教程

    转载自:https://blog.csdn.net/crper/article/details/46293295   以备记录使用.

  3. linux通信之信号

    一. 信号介绍 1.1. 什么是信号 1.1.1. 信号是内容受限的一种异步通信机制 a. 之所以称之为受限是因为通信内容在OS已经规定,内容简单,单一(signal.h文件中定义好) b. 信号本质 ...

  4. Python 入门之Python基础数据类型及其方法

    Python 入门之Python基础数据类型 1. 整型:int 用于计算,用于比较 (在赋值的时候先执行等号右边的内容) 1.1 整数的加 a = 10 b = 20 print(a + b) 结果 ...

  5. 【源码解读】cycleGAN(二) :训练

    源码地址:https://github.com/aitorzip/PyTorch-CycleGAN 训练的代码见于train.py,首先定义好网络,两个生成器A2B, B2A和两个判别器A, B,以及 ...

  6. 虚拟机的linux(CentOS)系统安装

    一.安装虚拟机:VirtualBox  1.软件下载:https://www.virtualbox.org/  2.一路点击下一步完成安装 二.安装linux:CentOS6.8  1.官方网站:ht ...

  7. CSS选择符有哪些?哪些属性可以继承

    下面是一些常用的选择器: 1.id选择器( # myid) 2.类选择器(.myclassname) 3.标签选择器(div, h1, p) 4.相邻选择器(h1 + p) 5.子选择器(ul > ...

  8. java中使用SimpleDateFormat实现字符串和日期的相互转换

    java中使用SimpleDateFormat实现字符串和日期的相互转换 import java.text.ParseException; import java.text.SimpleDateFor ...

  9. Apache 配置外网站点

    基于域名,一般是对外网站 www.etiantian.org/var/www/html/www blog.etiantian.org /var/www/html/blog bbs.tiantian.o ...

  10. python基础操作---string

    #coding:utf-8 var1 = 'Hello World!' print var1[::] print len(var1) print var1[0:len(var1)] print var ...