objc/runtime 探索(四)

前言 在这一篇中,我们来聊一聊runtime中method 定义 先来看一下method相关的定义 1 2 3 4 5 6 7 8 9 10 11 12 13 14 typedef struct objc_method *Method; typedef struct objc_selector *SEL; typedef void (*IMP)(void /* id, SEL, ... */ ); //方法描述 struct objc_method_description { SEL name; //方法名称 char *types; //参数类型字符串 }; //以下代码是 ObjC2.0 之前method的定义 struct objc_method { SEL method_name; char *method_types; IMP method_imp; } 里边有三个类型别名,在这儿先解释一下...

August 19, 2014

objc/runtime 探索(三)

前言 续前,本文主要谈论类中的变量和属性 1.Ivar 1.1 Ivar的类型 typedef objc_ivar * Ivar; 1 2 3 4 5 6 7 8 struct objc_ivar { char *ivar_name; //ivar名称 char *ivar_type; //ivar类型 int ivar_offset; //ivar偏移量 #ifdef __LP64__ int space; #endif }//ObjC2.0 已过时 Ivar是objc_ivar的指针,包含变量名称,变量类型等成员. 1.2 为类添加Ivar 运行时规定,只能在objc_allocateClassPair与objc_registerClassPair两个函数之间为类添加变量 如下所示: 1 2 3 4 5 6 7 8 //额外空间 未知,通常设置为 0 Class clazz = objc_allocateClassPair(父类class,类名,额外空间); //以NSString*为例 //变量size sizeof(NSString) //对齐 指针类型的为log2(sizeof(NSString*)) //类型 @encode(NSString*) BOOL flag = class_addIvar(clazz,变量名,变量size,对齐,类型); objc_registerClassPair(clazz); 1....

August 18, 2014

objc/runtime 探索(二)

前言 接上次的话题,继续就objc/runtime进行讨论. 经过今晚的探究,基本掌握了运行时的函数规则,总的有如下几种函数前缀. 在后边的文章中我会就一些问题再次讨论,本文权当做API的速查手册使用. objc_ class_ object_ method_ property_ protocol_ ivar_ ,sel_ ,imp_ 1.objc_xxx 系列函数 函数名称 函数作用 objc_getClass 获取Class对象 objc_getMetaClass 获取MetaClass对象 objc_allocateClassPair 分配空间,创建类(仅在 创建之后,注册之前 能够添加成员变量) objc_registerClassPair 注册一个类(注册后方可使用该类创建对象) objc_disposeClassPair 注销某个类 objc_allocateProtocol 开辟空间创建协议 objc_registerProtocol 注册一个协议 objc_constructInstance 构造一个实例对象(ARC下无效) objc_destructInstance 析构一个实例对象(ARC下无效) objc_setAssociatedObject 为实例对象关联对象 objc_getAssociatedObje*ct 获取实例对象的关联对象 objc_removeAssociatedObjects 清空实例对象的所有关联对象 objc_msgSend 发送ObjC消息 objc_系列函数关注于宏观使用,如类与协议的空间分配,注册,注销等操作...

August 17, 2014

objc/runtime 探索(一)

前言 最近闲来无事,打算对objc/runtime进行一番研究,今晚把API翻了一遍,拿出了如下的一些有趣代码,本代码需事先导入部分objc/runtime中的头文件,如下所示 1 2 #import <objc/runtime.h> #import <objc/message.h> 动态创建类 类的创建分为两步,添加成员变量需要在这两步操作之间,添加成员方法则无此要求 Class objc_allocateClassPair(Class superClass,const char* className,size_t extraBytes); void objc_registerClassPair(Class cls); 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 //开始类的定义 Class Test= objc_allocateClassPair([NSObject class], "Test", 0); //为类添加变量 class_addIvar(Test, "_name", sizeof(NSString*), log2(sizeof(NSString*)), @encode(NSString*)); //为类添加方法 //1.注册名为 test: 的方法 SEL s = sel_registerName("test:"); //2.定义函数实现,此处的IMP是函数指针,原型为 typedef id (*IMP)(id, SEL, ....

August 15, 2014

Objective-C 正则表达式的使用

前言: 编程中,对于字符串的处理是无处不在的.时常需要在一堆乱码中找到有用的信息.比如在如下的字符串中获取有效的 URL 或 Email ababsdbasbdabdhttp://baidu.com <div>test@test.com<div> 诸如此类问题,我们都可以通过正则表达式来解决,正则在任意编程语言都有对应实现. iOS4 之后,Cocoa 也提供了用于正则的 NSRegularExpression 和 NSTextCheckingResult 这两个类. 前者用于创建正则,匹配,替换;后者是一个快速匹配对象,可用于检查拼写,URL等,也可作为正则匹配的结果,包含匹配到子串所在 range 和匹配规则. 创建: NSRegularExpression * regex = [NSRegularExpression regularExpressionWithPattern:@"http[s]?://[A-z0-9.-]*" options:NSRegularExpressionCaseInsensitive error:nil]; 正则匹配模式 [] 表示集合, * 表示 出现零次或多次, ? 表示出现零次或一次, http[s]?://[A-z0-9.-]* ,即匹配以 http:// 或 https:// 开头,含有零或多个字母 - . 的字符串 option NSRegularExpressionCaseInsensitive //忽略大小写 NSRegularExpressionAllowCommentsAndWhitespace //忽略空格,回车,tab,注释 NSRegularExpressionIgnoreMetacharacters //忽略 Meta NSRegularExpressionDotMatchesLineSeparators //允许使用 . 通配任何符号,包括换行符 NSRegularExpressionAnchorsMatchLines //允许使用 ^ $匹配行头和行尾 NSRegularExpressionUseUnixLineSeparators //只把 \n 当做换行符 NSRegularExpressionUseUnicodeWordBoundaries 应用: NSRegularExpression 提供了对字符串 匹配 , 替换 的函数,...

May 29, 2014