iOS runtime机制 和数据库结合 使用方便开发

1 首先说一下 runtime 运行机制

对于OC 这门高级编程语言 其实在语言底层的实现 是用C语言来实现的 一个OC的类 翻译成C 语言其实就是一个结构体的类型,当然结构体是非常复杂的包括了这个类的所有信息,类的继承还是有点难度的,暂时不用考虑类的继承的问题,只要知道OC类 底层是转换成 C语言的结构体!

我们先看一下 OC 是怎样发送消息的 也就是对应C语言是如何实现函数的调用的过程!

[obj makeText];   //obj 这个类发送了一个  makeText的消息

之后runtime编译之后变成

objc_msgSend(obj,@selector(makeText));

其实这段代码我自己的理解就是 OC 中发送消息的机制  给obj这个地址的对象 发送一个 @selector(makeText) 这个函数指针 函数指针可以携带着 参数 也可以 不携带参数 这里举例子没有参数而已。

之后我们看一下 obj 这个对象 任何对象都继承与NSObject 看一下他的结构 一层一层的变到C语言 是如何实现的!

@interface NSObject <nsobject> {

    Class isa  OBJC_ISA_AVAILABILITY;

}</nsobject>

在NSObjcet中存在一个Class的isa指针。然后我们看看Class:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

typedef struct objc_class *Class;

struct objc_class {

  Class isa; // 指向metaclass

  

  Class super_class ; // 指向其父类

  const char *name ; // 类名

  long version ; // 类的版本信息,初始化默认为0,可以通过runtime函数class_setVersion和class_getVersion进行修改、读取

  long info; // 一些标识信息,如CLS_CLASS (0x1L) 表示该类为普通 class ,其中包含对象方法和成员变量;CLS_META (0x2L) 表示该类为 metaclass,其中包含类方法;

  long instance_size ; // 该类的实例变量大小(包括从父类继承下来的实例变量);

  struct objc_ivar_list *ivars; // 用于存储每个成员变量的地址

  struct objc_method_list **methodLists ; // 与 info 的一些标志位有关,如CLS_CLASS (0x1L),则存储对象方法,如CLS_META (0x2L),则存储类方法;

  struct objc_cache *cache; // 指向最近使用的方法的指针,用于提升效率;

  struct objc_protocol_list *protocols; // 存储该类遵守的协议

    }

其实看到这里 也就知道了内部发送消息机制的原理了 想我最开始说的那样 一个地址的对象 发送 一个函数指针而已

@selector(makeText) 这个其实是个函数指针

@selector (makeText):这是一个SEL方法选择器。SEL其主要作用是快速的通过方法名字(makeText)查找到对应方法的函数指针,然后调用其函 数。SEL其本身是一个Int类型的一个地址,地址中存放着方法的名字。对于一个类中。每一个方法对应着一个SEL。所以iOS类中不能存在2个名称相同 的方法,即使参数类型不同,因为SEL是根据方法名字生成的,相同的方法名称只能对应一个SEL。

下面我们就来看看具体消息发送之后是怎么来动态查找对应的方法的。

首先,编译器将代码[obj makeText];转化为objc_msgSend(obj, @selector (makeText));,在objc_msgSend函数中。首先通过obj的isa指针找到obj对应的class。在Class中先去cache中 通过SEL查找对应函数method(猜测cache中method列表是以SEL为key通过hash表来存储的,这样能提高函数查找速度),若 cache中未找到。再去methodList中查找,若methodlist中未找到,则取superClass中查找。若能找到,则将method加 入到cache中,以方便下次查找,并通过method中的函数指针跳转到对应的函数中去执行。

基本了解了 runtime 机制之后能 我们就知道我们可以通过 runtime这种机制 通过底层C语言的操作可以获得 一个类的 所有属性和属性的值  和所有方法的 名字! 其中获取这些属性和值 都是系统提供的方法 下面是获取一个对象 属性名字和属性值 组成的字典 代码不用懂知道就行 想研究自己深入地研究一下就行了

/* 获取对象的所有属性和属性内容 */

//这个方法 返回的是一个大字典 里边放着的是 属性和他们的值 属性是Key 值 是 Value

- (NSDictionary *)getAllPropertiesAndVaulesModel:(id)model

{

NSMutableDictionary *props = [NSMutableDictionary dictionary];

unsigned int outCount, i;

objc_property_t *properties = class_copyPropertyList([model class], &outCount);

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

{

objc_property_t property = properties[i];

const char* char_f =property_getName(property);

NSString *propertyName = [NSString stringWithUTF8String:char_f];

id propertyValue = [model valueForKey:(NSString *)propertyName];

/*下面注释的这条语句是这个函数 最开始的语句 目的获取值不为空的属性 我修改之后就可以获取model全部属

性当然model 属性必须全部写成NSString 类型的 不管实际的类型是什么!*/

//if (propertyValue) [props setObject:propertyValue forKey:propertyName];

//这样做 就可以获取model对象的全部属性!!!! 下面的代码是我修改的!

if (propertyValue == nil) {

[props setObject:@"nil" forKey:propertyName];

}else

{

[props setObject:propertyValue forKey:propertyName];

}

}

free(properties);

return props;

}

这样就获取到了 所有的属性 当属性做对应的值 为nil 的时候 我强行设置成 字符串 @"nil" 了 这个不用纠结 我自己做的你想怎么做都可以,这篇文章就先讲到这里 下一篇结合 数据库的操作 和 model 结合的讲一下 之后就可以存储 任意类型的 model 都可以非常方便的使用数据库了!哈哈期待吧!

时间: 2024-10-29 19:06:49

iOS runtime机制 和数据库结合 使用方便开发的相关文章

iOS --Runtime机制

/** 运行时(Runtime): * 苹果官方一套C语言库 * 能做很多底层操作(比如访问隐藏的一些成员变量\成员方法....) */ #import <objc/runtime.h> unsigned int count = 0 Ivar ivars = class_copyIvarList([UITextField class],&count); for(int i = 0; i < count; i ++) { Ivar ivar = ivars[i] NSLog(@&q

ios开发新手浅谈强大的runtime机制

runtime机制,实际上是一套底层的C语言代码,里面提供了很多的C数据类型和一些功能强大的C语言函数.我们所写的OC代码,在底层都是基于runtime来实现的.所以我们可以说OC实际就是披着面向对象外衣的C语言,因为在运行时,OC代码会编译成C/C++ 来运行.runtime中有很多的C函数,有着很强大的功能,比如 : 1. 能动态类的增删改 成员变量,方法 2.IOS Swizzle 能底层动态的交换两个方法(类方法和对象方法)的实现 IOS swizzle的具体做法: 1.在分类的load

iOS runtime探究(二): 从runtime開始深入理解OC消息转发机制

你要知道的runtime都在这里 转载请注明出处 http://blog.csdn.net/u014205968/article/details/67639289 本文主要解说runtime相关知识,从原理到实践.由于包括内容过多分为下面五篇文章详细解说.可自行选择须要了解的方向: 从runtime開始: 理解面向对象的类到面向过程的结构体 从runtime開始: 深入理解OC消息转发机制 从runtime開始: 理解OC的属性property 从runtime開始: 实践Category加入属

我理解的iOS中的RunTime机制(1)

一.首先我们要先知道object-c是一门编译型.动态语言(这里强调下oc是静态类型语言),这在开发语言中是并多见的,一般的动态语言多为解释性语言.oc之所以能够做到即使编译型语言,又是动态语言.就是得益于RunTime机制. 由于本文主要讲解的是RunTime机制,所以语言类型不做过多描述,之后可以另写一篇语言类型的介绍. 二.这里主要讲解RunTime如何使用,其中主要的知识点如下: 1.class_copyPropertyList  获取一份拷贝的成员列表数组 2.property_get

iOS的Runtime机制下给类别(category)添加属性、替换原有类的方法执行

一.Runtime的理解 OC是面向对象的语言这是常识,其实就是通过Runtime机制动态创建类和对象,这里只是简单的运用runtime的使用! 二.类别(category)添加属性_使用前记得导入头文件#import <objc/runtime.h> 通过这三个方法动态的绑定属性 OBJC_EXPORT void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy poli

iOS runtime和runloop

runtime 和 runloop 作为一个程序员进阶是必须的,也是非常重要的, 在面试过程中是经常会被问到的, 所以大家有必要进行研究,有能力的童鞋可以和下面作者一样, 亲历实践一下. 在简书里发现了两篇非常好的文章介绍 runtime和runloop的,在这里合二为一了, 把原版作者的东西拿了过来, 为了尊重作者,在这里注明一下 @sam_lau 是runtime的作者, @tripleCC是runloop的作者   RunTime Objective-C是基于C语言加入了面向对象特性和消息

iOS runtime原理

对于runtime机制,在网上找到的资料大概就是怎么去用这些东西,以及查看runtime.h头文件中的实现,当然这确实是一种很好的学习方法,但是,其实我们还是不会知道runtime底层编译成C++语言之后做了什么? 查到一个大牛给资料,顿时对runtime有了一定认识! 我们随便写一个小程序,代码如下: person类头文件如下, #import <Foundation/Foundation.h> @interface Person : NSObject @property (nonatomi

ios runtime的相关知识

一.iOS runtime原理 对于runtime机制,在网上找到的资料大概就是怎么去用这些东西,以及查看runtime.h头文件中的实现,当然这确实是一种很好的学习方法,但是,其实我们还是不会知道runtime底层编译成C++语言之后做了什么? 查到一个大牛给资料,顿时对runtime有了一定认识! 我们随便写一个小程序,代码如下: person类头文件如下, <!-- lang: cpp --> #import <Foundation/Foundation.h> @interf

IOS消息机制应用实例--异常处理

IOS消息机制应用实例--异常处理 最近发现了一个在项目中常用的异常处的工具NullSafe,分析了它的实现原理,不小心发现了一个小Bug,现将其分享出来,关于这篇文章的Demo已经上传至GitHub,看完如有收获,欢迎Star,如有疑问欢迎issue,大家一起学习.在IOS开发中我们可能会遇到下面的情景:服务器给我们返回得某个字段是null,比如someValue:null,这个时候我们利用第三方工具转化之后会得到someValue = <null>,这个时候如果我们判断这个someValu