文档章节

runtime探究

自在不在
 自在不在
发布于 2016/01/13 16:30
字数 966
阅读 94
收藏 1

1.runtime对OC中的语法的定义

/// 类的定义
struct objc_class {
    Class isa                                isa对象指针
    Class super_class                        父类                
    const char *name                         名称           
    long version                             版本              
    long info                                                
    long instance_size                       初始化大小               
    struct objc_ivar_list *ivars             成员变量列表               
    struct objc_method_list **methodLists    方法列表              
    struct objc_cache *cache                 用来缓存最近使用的方法,以提高效率;                
    struct objc_protocol_list *protocols     协议列表              
}
/// 方法的定义
struct objc_method_description {
    SEL name;               方法名称
    char *types;            方法参数的类型(类方法|对象方法)
}
///属性的定义
typedef struct {
    const char *name;           属性名称
    const char *value;          属性值
}

2.runtime中的函数

PS:这些函数不可以在ARC下使用
/*关于成员变量*/
///obj的拷贝函数(经测试为深拷贝)
id object_copy(id obj, size_t size)

///对象释放函数
id object_dispose(id obj)

///获取某一对象的类名(对应OC中的[obj Class]方法,还可以用这个返回值创建新的对象)
Class object_getClass(id obj)

///转换对象的类型 (测试将一个Person类改变成了NSString)
Class object_setClass(id obj, Class cls) 

///判断一个参数是类还是实例
BOOL object_isClass(id obj)

///返回一个对象的类名(返回的是一个const char指针)
const char *object_getClassName(id obj)

///返回一个对象所占内存空间的尾部指针
void *object_getIndexedIvars(id obj)

///返回属性值
id object_getIvar(id obj, Ivar ivar)

///设置属性值
void object_setIvar(id obj, Ivar ivar, id value)

///改变私有变量的值
Ivar object_setInstanceVariable(id obj, const char *name, void *value)

///获取私有变量的值
Ivar object_getInstanceVariable(id obj, const char *name, void **outValue)

///通过字符串获取类定义
Class objc_getClass(const char *name)

///通过字符串获取类所属的类
Class objc_getMetaClass(const char *name)

// 添加成员变量,只能够向在runtime时创建的类添加成员变量
BOOL class_addIvar(Class cls,const char *name,size_t size,uint8_t alignment,const char *types);
 
// 获取整个成员变量列表,返回的是个数组,使用用free()释放
Ivar * class_copyIvarList ( Class cls, unsigned int *outCount );

/*关于方法*/
// 添加方法
BOOL class_addMethod ( Class cls, SEL name, IMP imp, const char *types );

// 获取对象方法
Method class_getInstanceMethod ( Class cls, SEL name );

// 获取类方法
Method class_getClassMethod ( Class cls, SEL name );

// 获取所有方法
Method * class_copyMethodList ( Class cls, unsigned int *outCount );

// 重写方法
IMP class_replaceMethod ( Class cls, SEL name, IMP imp, const char *types );

// 返回方法的具体实现
IMP class_getMethodImplementation ( Class cls, SEL name );
IMP class_getMethodImplementation_stret ( Class cls, SEL name );

// 类实例是否响应指定的selector
BOOL class_respondsToSelector ( Class cls, SEL sel );

/*关于协议*/
// 添加协议
BOOL class_addProtocol ( Class cls, Protocol *protocol );

// 返回类是否实现指定的协议
BOOL class_conformsToProtocol ( Class cls, Protocol *protocol );

// 返回类实现的协议列表
Protocol * class_copyProtocolList ( Class cls, unsigned int *outCount );
/*关于类和实例*/
// 创建一个新类和元类
Class objc_allocateClassPair ( Class superclass, const char *name, size_t extraBytes ); 
// 销毁一个类及其子类
void objc_disposeClassPair ( Class cls ); //在运行中还存在或存在子类实例,就不能够调用这个。
// 在应用中注册由objc_allocateClassPair创建的类
void objc_registerClassPair ( Class cls );

使用 objc_msgSend 遇到 ( Conflicting types for 'objc_msgSend')

解决办法:

官方文档:https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaTouch64BitGuide/ConvertingYourAppto64-Bit/ConvertingYourAppto64-Bit.html

 

可见,使用时需要重新定义一下objc_msgSend函数。之前我还很迷惑,原函数当中的参数个数都不确定,它的内部怎么实现的,好神奇啊。。。哈哈哈,重新定义一下立马科学了。

注:如果您有更好的见解,请不吝赐教,感激不尽...

我的邮箱tianyun1201@163.com

© 著作权归作者所有

自在不在
粉丝 1
博文 24
码字总数 8518
作品 0
深圳
iOS工程师
私信 提问
(三)并不很深入地探究 arc中 __autoreleassing 修饰符

关联文章 (一)并不很深入地探究 arc中 strong 修饰符 (二)并不很深入地探究 arc中 weak 修饰符 (三)并不很深入地探究 arc中 _autoreleassing 修饰符 ARC是由编译器和运行时系统进行内存...

madaoCN
2017/10/06
0
0
如何自己动手实现 KVO

本文是 Objective-C Runtime 系列文章的第三篇。如果你对 Objective-C Runtime 还不是很了解,可以先去看看前两篇文章: Objective-C Runtime Method Swizzling 和 AOP 实践 本篇会探究 KVO ...

zh_iOS
2016/08/22
302
0
Objective-C Runtime(四)isa swizzling

Runtime 4 isa swizzling Objective-C Runtime(一) 简介 对象、类的结构 消息传递(Messaging) Objective-C Runtime(二) 动态方法解析和转发 Objective-C Runtime(三) Method Swizzli...

liuyanhongwl
2018/03/27
0
0
swift中KVO和属性观察器

开篇提醒:OC中的KVO及其KVO的基础知识可参见:深入runtime探究KVO Swift中,原本没有KVO模式,为何这么说,请看下文: KVO本质上是基于的动态分发机制,通过来监听的值。 OC能够实现监听因为...

CoderDancer
2017/01/13
0
0
webpack - babel 篇

前言 基于我的上篇文章,webpack4.0 入门篇 - 构建前端开发的基本环境,补充对进行的一次探究。上篇文章讲叙到的 时几乎一笔带过,所以这篇文章将进行补充说明. Babel 是一个让我们能够使用 ...

gershonv
2018/11/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

typescript 接口 函数类型 可索引类型

函数类型 可索引类型 数字索引签名 字符串索引签名 数字索引签名返回值 必须是 字符串索引签名返回值的子集 只读索引签名

lilugirl
今天
3
0
Oracle SQL语法实例合集

如需转载请注明出处https://my.oschina.net/feistel/blog/3052024 目的:迅速激活Oracle SQL 参考:《Oracle从入门到精通》 ------------------------------------------------------------......

LoSingSang
今天
2
0
增加 PostgreSQL 服务进程的最大打开文件数

https://serverfault.com/questions/628610/increasing-nproc-for-processes-launched-by-systemd-on-centos-7 要在systemd的配置里加才行...

helloclia
今天
2
0
组合模式在商品分类列表中的应用

在所有的树形结构中最适合的设计模式就是组合模式,我们看看常用商品分类中如何使用。 先定义一个树形结构的商品接口 public interface TreeProduct { List<TreeProduct> allProducts(...

算法之名
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部