runtime 知识点
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 知识点的更多相关文章
- iOS runtime 知识点整理
// ------ 动态创建类, 添加成员变量, 赋值并调用动态添加的方法 ------- @implementation ViewController - (void)viewDidLoad { [ ...
- 让你快速了解并掌握如何进行iOS开发技能
首先你要花点时间针对objective-c语言的学习:毕竟这个是iOS开发的基础(你也可以尝试用Swift,但此项目只是针对OC),编程套路其实都是差不多,多写多想多实践:关于环境的搭建就不在本文进行 ...
- 【干货分享】前端面试知识点锦集03(JavaScript篇)——附答案
三.JavaScript部分 1.谈谈你对Ajax的理解?(概念.特点.作用) AJAX全称为“Asynchronous JavaScript And XML”(异步JavaScript和XML) 是 ...
- C#知识点记录
用于记录C#知识要点. 参考:CLR via C#.C#并发编程.MSDN.百度 记录方式:读每本书,先看一遍,然后第二遍的时候,写笔记. CLR:公共语言运行时(Common Language Ru ...
- iOS runtime实用篇解决常见Crash
程序崩溃经历 其实在很早之前就想写这篇文章了,一直拖到现在. 程序崩溃经历1 平时开发测试的时候好好的,结果上线几天发现有崩溃的问题,其实责任大部分在我身上. 我的责任: 过分信赖文档,没进行容错处理 ...
- runtime 运行机制2
Mike_zh QQ:82643885 end: blogTitle 博客的标题和副标题 博客园 首页 新随笔 联系 订阅 <a id="MyLinks1_XMLLink" ...
- WIX 安装部署教程(六) 为你收集的七个知识点
前段时间整理5篇WIX(Windows Installer XML)的安装教程,但还不够完善,这里继续整理了七个知识点分享给大家.WIX最新版本3.8,点击下载 WIX安装部署(一)同MSBuild自 ...
- php易混淆知识点
一.define(“constant”, “hello world”);和const constant = “hello world”;的区别? (0).使用const使得代码简单易读,const本 ...
- Android开发涉及有点概念&相关知识点(待写)
前言,承接之前的 IOS开发涉及有点概念&相关知识点,这次归纳的是Android开发相关,好废话不说了.. 先声明下,Android开发涉及概念比IOS杂很多,可能有很多都题不到的.. 首先由 ...
随机推荐
- 客户端发一个post请求
public static String doPostStr(String httpUrl, String str) { HttpPost httpPost = null; try { HttpCli ...
- UVA 10129 Play on Words(欧拉道路)
题意:给你n个字符串,问你是否可以出现一条链,保证链中每个字符串的第一个元素与上一个字符串的最后一个元素相同,注意可能重复出现同一个字符串 题解:以每一个字符串第一个元素指向最后一个元素形成一个有向图 ...
- 09_MySQL DQL_SQL99标准中的多表查询(外连接)
# 二.外连接/* 场景:查询值在1个表中出现,在另外1个表中没有出现 特点: 0.也是两张表的字段拼接,分为主表和从表 1.外连接的结果,将显示主表中的所有记录行 如果连接字段在从表中有记录,则显示 ...
- session.资料
1. HttpSessionListener https://www.cnblogs.com/diewufeixian/p/4221747.html 2. 3. 4. 5.
- jquery 表格自动拆分(方便打印)插件-printTable
/** * jquery 表格打印插件 * * 作者: LiuJunGuang * 日期:2013年6月4日 * 分页样式(需要自定义): * @media print { * .pageBreak ...
- ubuntu下python安装pandas和numpy等依赖库版本不兼容的问题RuntimeWarning: numpy.dtype size changed
习惯了linux下用pip install numpy及pip install pandas命令了.折腾了好久了. 上来先在python3中pip3 install numpy装了numpy,然后再p ...
- jshint options
jshint -W032 忽略if代码块后有多余的分号的提示 地址:jslinterrors.com/unnecessary-semicolon asi 忽略函数定义后必须加分号的提示 c ...
- Eclipse创建Maven聚合项目
整体架构图 1.新建父工程 新建maven父项目(用来管理jar包版本),使子系统使用同一个版本的jar包. File->New->Other->Maven Project,打包方式 ...
- 搞懂分布式技术12:分布式ID生成方案
搞懂分布式技术12:分布式ID生成方案 ## 转自: 58沈剑 架构师之路 2017-06-25 一.需求缘起 几乎所有的业务系统,都有生成一个唯一记录标识的需求,例如: 消息标识:message-i ...
- Java的优势
Java是一种跨平台,适合于分布式计算环境的面向对象编程语言. 具体来说,它具有如下特性: 简单性.面向对象.分布式.解释型.可靠.安全.平台无关.可移植.高性能.多线程.动态性等. 下面我们将重点介 ...