demo https://github.com/ZOYOOPlus/runtime2

//

//  ViewController.m

//  runtime

//  Copyright © 2017年 四海八荒. All rights reserved.

//

#import "ViewController.h"

#import "MyObject.h"

#import "UIView+TYView.h"

#import <objc/runtime.h>

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {//    1.类相关函数

//    得到类名 ViewController

NSLog(@"%s",class_getName([self class]));

//    父类类名

//    This is superClass 0x10f426da0  isa指针地址

NSLog(@"This is superClass %p",class_getSuperclass([self class]));

//    是否是元类

//    Is MateClass 0

NSLog(@"Is MateClass %d",class_isMetaClass([self class]));

//    实例变量大小

//    848

size_t a =  class_getInstanceSize([self class]);

NSLog(@"%ld",a);

unsigned int outCount = 0;

MyObject *objtect = [[MyObject alloc] init];

Class cls = objtect.class;

//类名

NSLog(@"Class name %s",class_getName(cls));

//父类名字

NSLog(@"SuperClass name  %s",class_getName(class_getSuperclass(cls)));

//是否元类

NSLog(@"Is MetaClass %@",(class_isMetaClass(cls))?@"":@"NOT");

//变量大小

NSLog(@"MyObject size %ld",class_getInstanceSize(cls));

//变量信息

Ivar string = class_getInstanceVariable(cls, "_string");

if (string != NULL) {

NSLog(@"MyObject instance messge %s",ivar_getName(string));

}

// 属性操作

objc_property_t *v = class_copyPropertyList(cls, &outCount);

for (NSInteger i = 0; i< outCount; i++) {

objc_property_t property = v[i];

NSLog(@"property is %s ",property_getName(property));

}

free(v);

//成员变量

Ivar *vars = class_copyIvarList(cls, &outCount);

for (NSInteger i =0; i< outCount; i++) {

Ivar ivar = vars[i];

NSLog(@"copyIvarList is %s is %ld",ivar_getName(ivar),i);

}

free(vars);

//方法操作

Method *methods = class_copyMethodList(cls, &outCount);

for (NSInteger i =0; i< outCount; i++) {

Method met = methods[i];

#pragma clang diagnostic ignored"-Wformat"

NSLog(@"Method is %s",method_getName(met));

}

free(methods);

//  Format specifies type 'char *' but the argument has type 'SEL _Nonnull'

// 获取方法名

Method method = class_getInstanceMethod(cls,@selector(method1));

NSLog(@"Method name is %s",method_getName(method));

//    判断方法是否存在

#pragma clang diagnostic ignored"-Wundeclared-selector"

NSLog(@"Have you method %d",class_respondsToSelector(cls, @selector(method3WithArge1:arge2:)));

//    指向函数实现的指针,相当于方法的实现

IMP imp = class_getMethodImplementation(cls, @selector(method1));

imp();

//动态创建类

#pragma clang diagnostic ignored" -Wunused-variable"

// 注:运行时规定,只能在objc_allocateClassPair与objc_registerClassPair两个函数之间为类添加变量

//  1.添加一个自定义的类 类名是MySubClass

//  父类class,类名,额外空间

Class myClass = objc_allocateClassPair(objtect.class, "MySubClass", 0);

//  2.增加方法,交换方法

//注:  v@: 意思是 v是void   @:没有返回参数

if( class_addMethod(myClass, @selector(mysubMethod1),(IMP)mysubMethod1, "v@:")){

class_replaceMethod(myClass, @selector(method1),  (IMP)mysubMethod1,"v@:");

}

/*

3.增加一个NSSsting类型属性  属性名myString

变量size sizeof(NSString)

对齐     指针类型的为log2(sizeof(NSString*))

类型     @encode(NSString*)

class_addIvar(class,变量名,变量size,对齐,类型)

*/

//添加同名属性会失败

BOOL isd =  class_addIvar(myClass, "_myString", sizeof(NSString *),  log(sizeof(NSString *)), @encode(NSString *));

NSLog(@"属性是否添加成功 %d",isd);

/*

特性相关编码

属性的特性字符串 以 T@encode(type) 开头, 以 V实例变量名称 结尾,中间以特性编码填充,通过property_getAttributes即可查看

特性编码 具体含义

R readonly

C copy

& retain ARC strong

N nonatomic

G(name) getter=(name)

S(name) setter=(name)

D @dynamic

W weak

P 用于垃圾回收机制

*/

//@T

objc_property_attribute_t type;

type.name = "T";

type.value = @encode(NSString *);

//copy

objc_property_attribute_t owership = {"C",""};

//nonatomic

objc_property_attribute_t oeership2 = {"N",""};

//V_属性名

objc_property_attribute_t var = {"V","_myString"};

//特性数组

objc_property_attribute_t attributes[] = {type,owership,oeership2,var};

//向类中添加名为myString的属性,属性的特性包含在attributes中

class_addProperty(myClass, "myString", attributes, 4);

unsigned int propertyCount;

objc_property_t * properties = class_copyPropertyList(myClass, &propertyCount);

for (int i = 0; i<propertyCount; i++) {

NSLog(@"属性的名称为 : %s",property_getName(properties[i]));

NSLog(@"属性的特性字符串为: %s",property_getAttributes(properties[i]));

}

//释放属性列表数组

free(properties);

//在应用中注册由objc_allocateClassPair创建的类

objc_registerClassPair(myClass);

id instance = [[myClass alloc] init];

[instance performSelector:@selector(mysubMethod1)];

[instance performSelector:@selector(method1)];

// 销毁一个类及相关联的类

//    不过需要注意的是,如果程序运行中还存在类或其子类的实例,则不能调用针对类调用该方法

//objc_disposeClassPair(myClass);

//关联对象

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];

view.backgroundColor = [UIColor redColor];

[view setTapActionWithBlock:^{

NSLog(@"saAS");

}];

[self.view addSubview:view];

//    SEL

//    Objective-C在编译时,会依据每一个方法的名字、参数序列,生成一个唯一的整型标识(Int类型的地址),这个标识就是SEL

//    SEL只是一个指向方法的指针(准确的说,只是一个根据方法名hash化了的KEY值,能唯一代表一个方法

//  而对于字符串的比较仅仅需要比较他们的地址就可以了,可以说速度上无语伦比

//    sel : 0x104dd7735

/*

三种方法来获取SEL:

sel_registerName函数

Objective-C编译器提供的@selector()

NSSelectorFromString()方法

*/

SEL sel1 = @selector(method1);

NSLog(@"sel : %p", sel1);

}

static void mysubMethod1(id self,SEL _cmd){

NSLog(@"这是添加的方法");

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

@end

增加中,可先看demo

runtime 知识点的更多相关文章

  1. iOS runtime 知识点整理

    // ------ 动态创建类, 添加成员变量, 赋值并调用动态添加的方法 ------- @implementation ViewController - (void)viewDidLoad { [ ...

  2. 让你快速了解并掌握如何进行iOS开发技能

    首先你要花点时间针对objective-c语言的学习:毕竟这个是iOS开发的基础(你也可以尝试用Swift,但此项目只是针对OC),编程套路其实都是差不多,多写多想多实践:关于环境的搭建就不在本文进行 ...

  3. 【干货分享】前端面试知识点锦集03(JavaScript篇)——附答案

    三.JavaScript部分 1.谈谈你对Ajax的理解?(概念.特点.作用) AJAX全称为“Asynchronous JavaScript And XML”(异步JavaScript和XML) 是 ...

  4. C#知识点记录

    用于记录C#知识要点. 参考:CLR via C#.C#并发编程.MSDN.百度 记录方式:读每本书,先看一遍,然后第二遍的时候,写笔记. CLR:公共语言运行时(Common Language Ru ...

  5. iOS runtime实用篇解决常见Crash

    程序崩溃经历 其实在很早之前就想写这篇文章了,一直拖到现在. 程序崩溃经历1 平时开发测试的时候好好的,结果上线几天发现有崩溃的问题,其实责任大部分在我身上. 我的责任: 过分信赖文档,没进行容错处理 ...

  6. runtime 运行机制2

    Mike_zh QQ:82643885 end: blogTitle 博客的标题和副标题 博客园 首页 新随笔 联系 订阅 <a id="MyLinks1_XMLLink" ...

  7. WIX 安装部署教程(六) 为你收集的七个知识点

    前段时间整理5篇WIX(Windows Installer XML)的安装教程,但还不够完善,这里继续整理了七个知识点分享给大家.WIX最新版本3.8,点击下载 WIX安装部署(一)同MSBuild自 ...

  8. php易混淆知识点

    一.define(“constant”,  “hello world”);和const constant = “hello world”;的区别? (0).使用const使得代码简单易读,const本 ...

  9. Android开发涉及有点概念&相关知识点(待写)

    前言,承接之前的 IOS开发涉及有点概念&相关知识点,这次归纳的是Android开发相关,好废话不说了.. 先声明下,Android开发涉及概念比IOS杂很多,可能有很多都题不到的.. 首先由 ...

随机推荐

  1. 制作 macOS High Sierra U盘USB启动安装盘方法教程 (全新安装 Mac 系统)

    方法一:使用命令行创建制作 macOS High Sierra 正式版 USB 安装盘 首先,准备一个 8GB 或更大容量的 U盘,并备份好里面的所有资料. 下载好 macOS High Sierra ...

  2. CBT怎样进行注册

    CBT币未来升值千倍?揭秘为何比特云币注册认证送矿机? 比特云币先机先机,1月6号准备启动,虚拟货币新宠云比特(Cloud Bit 简称CBT)将于近日强势登陆交易市场.这款由全球最大的比特矿工联盟发 ...

  3. [笔记整理]SQL Server 索引碎片 和 重建索引

    铺垫知识点: 数据库存储本身是无序的,建立了聚集索引,会按照聚集索引物理顺序存入硬盘.既键值的逻辑顺序决定了表中相应行的物理顺序 多数情况下,数据库读取频率远高于写入频率,索引的存在 为了读取速度牺牲 ...

  4. 04_zookeeper客户端使用及常用命令

    zookeeper客户端的使用 (1)   首先找到zookeeper自带客户端的位置 简单来说,zookeeper自带客户端位于zookeeper安装目录的bin目录下,以我的为例: (2)   运 ...

  5. 编译binutil包报错cc: error trying to exec 'cc1obj': execvp: No such file or directory

    在http://forums.fedoraforum.org/showthread.php?t=267449中找到的解决方法 $LFS/sources/binutils-2.15.91.0.2/gpr ...

  6. Javascript实用技巧

    1. 给参数赋默认值 //通常写法 function dateRender(format){ if(format){ format = 'Y-m-d'; } // code } //强推 functi ...

  7. u-boot-2015.07 autoconf.mk生成过程分析

    1.u-boot2015.7版本编译没有在顶层目录中生成.config文件,而生成了include/autoconf.mk和include/autoconf.mk.dep两个文件,并在每个模块编译的时 ...

  8. 通过ajax提交到url路由

    $regBoxform.find('button').on('click', function(){ /*通过ajax提交请求*/ $.ajax({ type:'post', /*用post 方式提交 ...

  9. 蓄水池抽样算法 Reservoir Sampling

    2018-03-05 14:06:40 问题描述:给出一个数据流,这个数据流的长度很大或者未知.并且对该数据流中数据只能访问一次.请写出一个随机选择算法,使得数据流中所有数据被选中的概率相等. 问题求 ...

  10. MongoDB 查看所有用户账号信息

    在 MongoDB 中创建了很多帐号,怎么查看所有帐号信息? 1. 查看全局所有账户 2. 查看当前库下的账户 查看全局所有账户 : > use admin switched to db adm ...