runtime探究
2016-01-13 00:00
190 查看
摘要: 在学习runtime之前这个单词已经如雷贯耳,觉得非常牛B。看了一些资料大致了解到:
1.runtime是一套C语言的API
2.OC语言的实现是借助runtime的,runtime相当于OC与C语言的翻译官
3.runtime可以动态的创建和访问对象。(实际上应该是动态的创建一块内存和使用该块内存)。
更新:使用 objc_msgSend 遇到 ( Conflicting types for 'objc_msgSend')
下面就是一些对runtime.h解释和自我理解,笔者水平有限欢迎指正。
1.runtime对OC中的语法的定义
2.runtime中的函数
[b]使用 objc_msgSend 遇到 ( Conflicting types for 'objc_msgSend')[/b]
解决办法:
官方文档:https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaTouch64BitGuide/ConvertingYourAppto64-Bit/ConvertingYourAppto64-Bit.html
可见,使用时需要重新定义一下objc_msgSend函数。之前我还很迷惑,原函数当中的参数个数都不确定,它的内部怎么实现的,好神奇啊。。。哈哈哈,重新定义一下立马科学了。
注:如果您有更好的见解,请不吝赐教,感激不尽...
我的邮箱tianyun1201@163.com
1.runtime是一套C语言的API
2.OC语言的实现是借助runtime的,runtime相当于OC与C语言的翻译官
3.runtime可以动态的创建和访问对象。(实际上应该是动态的创建一块内存和使用该块内存)。
更新:使用 objc_msgSend 遇到 ( Conflicting types for 'objc_msgSend')
下面就是一些对runtime.h解释和自我理解,笔者水平有限欢迎指正。
1.runtime对OC中的语法的定义
[code=plain]/// 类的定义 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中的函数
[code=plain]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 );
[b]使用 objc_msgSend 遇到 ( Conflicting types for 'objc_msgSend')[/b]
解决办法:
官方文档:https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaTouch64BitGuide/ConvertingYourAppto64-Bit/ConvertingYourAppto64-Bit.html
可见,使用时需要重新定义一下objc_msgSend函数。之前我还很迷惑,原函数当中的参数个数都不确定,它的内部怎么实现的,好神奇啊。。。哈哈哈,重新定义一下立马科学了。
注:如果您有更好的见解,请不吝赐教,感激不尽...
我的邮箱tianyun1201@163.com
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- Java Runtime Environment 5.0 Update 12 下载
- php set_magic_quotes_runtime() 函数过时解决方法
- Asp.Net 程序错误Runtime Error原因与解决
- 讲解iOS开发中基本的定位功能实现
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- 浅析iOS应用开发中线程间的通信与线程安全问题
- 检测iOS设备是否越狱的方法
- System 类 和 Runtime 类的常用用法介绍
- .net平台推送ios消息的实现方法
- 探讨Android与iOS,我们将何去何从?
- Android、iOS和Windows Phone中的推送技术详解
- IOS 改变键盘颜色代码