1 举例  我们实现一个Person类 然后Person 其实是没得对象方法eat:的

下面调用person的eat方法 程序是会奔溃的 那么需要借助运行时动态的添加方法

Person *p = [[Person alloc]init];
[p performSelector:@selector(eat:) withObject:@"鸡腿"];

在perosn.m文件中进行实现运行时动态添加方法

//
// Person.m
// 运行时(动态添加方法)
//
// Created by ALD on 2018/6/4.
// Copyright © 2018年 ALD. All rights reserved.
// #import "Person.h"
#import <objc/message.h>
@implementation Person
//使用到了未定义的类方法
//+(BOOL)resolveClassMethod:(SEL)sel{
//
//} // 定义eat 方法 默认会前面两个隐式参数 id self, SEL _cmd 第三个才是我们自己传入的参数
void eat(id self, SEL _cmd ,id object ){
NSLog(@"吃了%@", object);
}
//使用到了未定义的对象方法
+(BOOL)resolveInstanceMethod:(SEL)sel{
NSLog(@"%@", NSStringFromSelector(sel));
if (sel == @selector(eat:)) {
//动态添加方法 /**
<#Description#> @param cls#> 那个类 description#>
@param name#> 方法名 description#>
@param imp#> 方法指针 description#>
@param types#> 方法类型 description#>
@return <#return value description#>
*/
// class_addMethod(<#Class _Nullable __unsafe_unretained cls#>, <#SEL _Nonnull name#>, <#IMP _Nonnull imp#>, <#const char * _Nullable types#>)
class_addMethod([self class], @selector(eat:), (IMP)eat, "v");
}
return [super resolveInstanceMethod:sel]; }
@end

对 class_addMethod  不太理解里面参数含义可以去文档查询 拷贝 shift + command + 0 然后搜索你想查的方法

iOS运行时使用(动态添加方法)的更多相关文章

  1. 趣谈iOS运行时的方法调用原理

    一个成熟的计算机语言必然有丰富的体系,复杂的容错机制,处理逻辑以及判断逻辑.但这些复杂的逻辑都是围绕一个主线丰富和展开的,所以在学习计算机语言的时候,先掌握核心,然后了解其原理,明白程序语言设计的实质 ...

  2. ios的runtime为什么可以动态添加方法

    一句话概括 每个instance都有一个isa,这个isa,里面含有所有的方法列表,ios提供库函数增加,修改,即实现了动态添加方法

  3. ios开发runtime学习三:动态添加方法(实际应用少,面试)

    #import "ViewController.h" #import "Person.h" /* 1: Runtime(动态添加方法):OC都是懒加载机制,只要 ...

  4. iOS运行时 -- Runtime(摘抄自网络)

    运行时(iOS) 一.什么是运行时(Runtime)? 运行时是苹果提供的纯C语言的开发库(运行时是一种非常牛逼.开发中经常用到的底层技术) 二.运行时的作用? 能获得某个类的所有成员变量 能获得某个 ...

  5. 使用runtime给类动态添加方法并调用 - class_addMethod

    上手开发 iOS 一段时间后,我发现并不能只着眼于完成需求,利用闲暇之余多研究其他的开发技巧,才能在有限时间内提升自己水平.当然,“其他开发技巧”这个命题对于任何一个开发领域都感觉不找边际,而对于我来 ...

  6. iOS 运行时详解

    注:本篇文章转自:http://www.jianshu.com/p/adf0d566c887 一.运行时简介 Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行 ...

  7. 【JVM第五篇--运行时数据区】方法区

    写在前面的话:本文是在观看尚硅谷JVM教程后,整理的学习笔记.其观看地址如下:尚硅谷2020最新版宋红康JVM教程 一.栈.堆.方法区的关系 虚拟机运行时的数据区如下所示: 即方法区是属于线程共享的内 ...

  8. 快速上手Runtime(四)之动态添加方法

    如果一个类方法非常多,加载类到内存的时候也比较耗费资源,可以使用动态给某个类,添加方法解决.做到优化内存,节省资源的效果. // // Person.m // ResolveInstanceMetho ...

  9. iOS 运行时使用(交换两个方法)

    举例 在创建了如下代码 NSString *str=nil; NSURL *url =[NSURL URLWithString:str]; NSLog(@"%@",url); 但是 ...

随机推荐

  1. -如何存储并定时更新access_token

    来源:https://blog.csdn.net/sct_t/article/details/53002611 我们知道请求access_Token会返回这样一个json,包括access_token ...

  2. mybatis 动态sql 插入报错

    1. 值为null必须制定jdbcType 单条执行的话,可以考虑把值为null的字段去掉 2. 值的类型无法解析 比如oracle.sql.TIMESTAMP类型,需转为java.sql.TIMES ...

  3. spring cloud(学习笔记) Enreka服务治理

    服务治理是微服务架构最为核心和基础的模块,主要用来实现各个微服务实例的自动化注册和发现. 记录一下服务注册中心的搭建以及高可用注册中心的实现 1.首先创建两个基础 的spring boot工程,spr ...

  4. script标签

    script 元素既可以包含脚本语句,也可以通过 src 属性指向外部脚本文件.默认情况下script标签的会阻止文档渲染,相关脚本会立即下载并执行. 属性 在HTML5中script主要有以下几个属 ...

  5. linux scanf函数%d后加空白

    参考链接: https://bbs.csdn.net/topics/390389059 关键点: scanf()中空白字符(包括/n,space)会使scanf()函数在读操作中略去输入中的零个或者一 ...

  6. eureka 学习

    Eureka is a REST (Representational State Transfer) based service that is primarily used in the AWS c ...

  7. Flask图书管管理表

    后端的读写 from flask import Flask,render_template,request from flask_sqlalchemy import SQLAlchemy #导入时间模 ...

  8. Aizu - 2249 Road Construction

    题目:给出若干个建筑之间的一些路,每条路都有对应的长度和需要的花费,问在保证源点1到其他个点的距离最短的情况下,最少的花费是多少/ 思路:和一般的最短路问题相比,多了一个 数组id[i],用来记录到达 ...

  9. linux中管理包的apt和dpkg命令用法

    1,apt-get命令 apt-get是debian,ubuntu发行版的包管理工具,与红帽中的yum工具非常类似,适用于deb包管理式的操作系统,主要用于自动从互联网的软件仓库中搜索.安装.升级.卸 ...

  10. vmware常用命令

    控制台桌面执行快捷键ctrl+alt+f2 可以进入命令行