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. ue4 编辑器记录

    Matinee 编辑器 菜单:Add New Empty Group->选择要变动的Actor->菜单:Add Actor->菜单:Add Key->变更Actor属性-> ...

  2. Coursera, Deep Learning 1, Neural Networks and Deep Learning - week1, Introduction to deep learning

    整个deep learing 系列课程主要包括哪些内容 Intro to Deep learning

  3. Kafka思维导图

  4. Core Mvc传值Query、Form、Cookies、Session、TempData、Cache

    1.传值方法 使用Request的方法(1-3): 1)Query:获取链接?后面的值 如:http://localhost:55842/Home/About?name=kxy public IAct ...

  5. react踩坑记录——使用fetch获取json数据报错

    报错: 原因其实是list.json文件路径错误,该文件路径是相对于index.html的,而不是App.js或者index.js.

  6. 添加日志(配置spring)---Java_web

    一.配置日志--以下三部 1.配置web.xml;  2.配置 log4j.properties;  3.配置jar包 以下是文件目录 二.配置 web.xml (注意:下面的classpath即lo ...

  7. Tip:JSP标签也称之为Jsp Action(JSP动作)元素

    JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护. ================ &l ...

  8. 【Convex Optimization (by Boyd) 学习笔记】Chapter 1 - Mathematical Optimization

    以下笔记参考自Boyd老师的教材[Convex Optimization]. I. Mathematical Optimization 1.1 定义 数学优化问题(Mathematical Optim ...

  9. 使用CORS方式跨域

    什么是CORS CORS(Cross-Origin Resource Sharing 跨源资源共享),当一个请求url的协议.域名.端口三者之间任意一与当前页面地址不同即为跨域. ===前端 不需要携 ...

  10. cartographer 最新版安装测试

    在官网的基础上稍加修改,但保证代码都是最新的 我的系统配置: Debian9 strech,  ROS lunar 该方法对 ubuntu 系列操作系统以及其他ROS版本同样适用. 1.  安装依赖库 ...