Runtime(运行时)003-动态添加方法

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "Yuanti SC"; color: #ff2600; background-color: #ffffff }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "Yuanti SC"; color: #d12f1b; background-color: #ffffff }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "Yuanti SC"; color: #ba2da2; background-color: #ffffff }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "Yuanti SC"; color: #008400; background-color: #ffffff }
p.p5 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "Yuanti SC"; color: #0433ff; background-color: #ffffff }
p.p6 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "Yuanti SC"; color: #aa7942; background-color: #ffffff }
p.p7 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "Yuanti SC"; color: #ff40ff; background-color: #ffffff }
p.p8 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "Yuanti SC"; color: #000000; background-color: #ffffff }
p.p9 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "Yuanti SC"; color: #3e1e81; background-color: #ffffff }
span.s1 { color: #78492a }
span.s2 { color: #000000 }
span.s3 { color: #008400 }
span.s4 { color: #ba2da2 }
span.s5 { color: #ff2600 }
span.s6 { color: #31595d }
span.s7 { color: #d12f1b }
span.s8 { color: #703daa }

class_addMethod

#import "Person.h"

#import <objc/message.h>

@implementation Person

/*

OC的方法调用,会传递两个隐式参数!给IMP(方法实现)!!

 objc_msgSend(self,_cmd);

id self 方法调用者

SEL _cmd 方法编号

*/

//instanceMethod 实例方法  classMethod 类方法

//如果该类接收到一个没有实现的实例方法,就会来到这里

+(BOOL)resolveInstanceMethod:(SEL)sel {

//NSLog(@"%@",NSStringFromSelector(sel));

//动态添加一个方法!!

/*

1.class 哪个类

2.SEL

3.IMP 函数的指针

4.返回值类型

*/

class_addMethod(self, sel, (IMP)haha, "[email protected]:@");

return [super resolveInstanceMethod:sel];

}

void haha(id obj, SEL sel , NSString*objc) {

//NSLog(@"吃到了%@",objc);

//obj 调用者

    //sel 方法编号

    //objc 参数

NSLog(@"%@--%@--%@",obj,NSStringFromSelector(sel),objc);//(null)--eat:--汉堡!!

//objc_msgSend(p,@selector(eat:),@"汉堡");

}

void myMethodIMP(id self, SEL _cmd)//默认参数

{

// implementation ....

}

原文地址:https://www.cnblogs.com/StevenHuSir/p/Runtime_AddMethod.html

时间: 2024-11-05 09:06:45

Runtime(运行时)003-动态添加方法的相关文章

运行时。。::分类并不是不可以扩充成员变量,可以用运行时机制动态添加成员变量

运行时机制是纯C语言,平时写得OC代码最终都要转成C运行时代码 @property在category中只能实现get,set方法的声明,不能实现方法的实现 #import <objc/message.h> objc_setAssociatedObject(<#id object#>, <#const void *key#>, <#id value#>, <#objc_AssociationPolicy policy#>) static int h

Objective-C Runtime 运行时之三:方法与消息

基础数据类型 SEL SEL又叫选择器,是表示一个方法的selector的指针,其定义如下: typedef struct objc_selector *SEL; objc_selector结构体的详细定义没有在<objc/runtime.h>头文件中找到.方法的selector用于表示运行时方法的名字.Objective-C在编译时,会依据每一个方法的名字.参数序列,生成一个唯一的整型标识(Int类型的地址),这个标识就是SEL.如下代码所示: 1 2 SEL sel1 = @selecto

[ObjectC]Runtime运行时之三:方法与消息

这一章,我们就要开始讨论Runtime中最有意思的一部分:消息处理机制.我们将详细讨论消息的发送及消息的转发. 基础数据类型 SEL SEL又叫选择器,是表示一个方法的selector的指针,其定义如下: typedef struct objc_selector *SEL; objc_selector结构体的详细定义没有在<objc/runtime.h>头文件中找到.方法的selector用于表示运行时方法的名字.Objective-C在编译时,会依据每一个方法的名字.参数序列,生成一个唯一的

Objective-C Runtime 运行时之三:方法与消息(转载)

前面我们讨论了Runtime中对类和对象的处理,及对成员变量与属性的处理.这一章,我们就要开始讨论Runtime中最有意思的一部分:消息处理机制.我们将详细讨论消息的发送及消息的转发.不过在讨论消息之前,我们先来了解一下与方法相关的一些内容. 基础数据类型 SEL SEL又叫选择器,是表示一个方法的selector的指针,其定义如下: typedef struct objc_selector *SEL; objc_selector结构体的详细定义没有在<objc/runtime.h>头文件中找

[转]Objective-C Runtime 运行时之三:方法与消息

前面我们讨论了Runtime中对类和对象的处理,及对成员变量与属性的处理.这一章,我们就要开始讨论Runtime中最有意思的一部分:消息处理机制.我们将详细讨论消息的发送及消息的转发.不过在讨论消息之前,我们先来了解一下与方法相关的一些内容. 基础数据类型 SEL SEL又叫选择器,是表示一个方法的selector的指针,其定义如下: 1 typedef struct objc_selector *SEL; objc_selector结构体的详细定义没有在头文件中找到.方法的selector用于

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

上手开发 iOS 一段时间后,我发现并不能只着眼于完成需求,利用闲暇之余多研究其他的开发技巧,才能在有限时间内提升自己水平.当然,“其他开发技巧”这个命题对于任何一个开发领域都感觉不找边际,而对于我来说,尝试接触 objc/runtime 不失为是开始深入探索 iOS 开发的第一步. 刚了解 runtime 当然要从比较简单的 api 开始,今天就罗列整理一下 class_addMethod 的相关点: 首先从文档开始. /** * Adds a new method to a class wi

Runtime(动态添加方法)

A问:  有没有使用过performSelector,什么时候使用?动态添加方法的时候使用过?怎么动态添加方法?用runtime?为什么要动态添加方法? B:Runtime(动态添加方法):OC都是懒加载机制,只要一个方法实现了,就会马上添加到方法列表中. app:免费版,收费版 QQ,微博,直播等等应用,都有会员机制 // 任何方法默认都有两个隐式参数,self,_cmd // 什么时候调用:只要一个对象调用了一个未实现的方法就会调用这个方法,进行处理 // 作用:动态添加方法,处理未实现 +

iOS开发——高级特性&amp;Runtime运行时特性详解

Runtime运行时特性详解 本文详细整理了 Cocoa 的 Runtime 系统的知识,它使得 Objective-C 如虎添翼,具备了灵活的动态特性,使这门古老的语言焕发生机.主要内容如下: 引言 简介 与Runtime交互 Runtime术语 消息 动态方法解析 消息转发 健壮的实例变量(Non Fragile ivars) Objective-C Associated Objects Method Swizzling 总结 引言 曾经觉得Objc特别方便上手,面对着 Cocoa 中大量

Runtime运行时机制

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #78492a } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "PingFang SC"; color: #000000 } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px "PingFang SC"; color

Objective-C Runtime 运行时之一:类与对象

Objective-C语言是一门动态语言,它将很多静态语言在编译和链接时期做的事放到了运行时来处理.这种动态语言的优势在于:我们写代码时能够更具灵活性,如我们可以把消息转发给我们想要的对象,或者随意交换一个方法的实现等. 这种特性意味着Objective-C不仅需要一个编译器,还需要一个运行时系统来执行编译的代码.对于Objective-C来说,这个运行时系统就像一个操作系统一样:它让所有的工作可以正常的运行.这个运行时系统即Objc Runtime.Objc Runtime其实是一个Runti