iOS开发笔试面试- runtime的原理(一)

首先先说一个简书作者的博客,把runtime入门讲得够清晰。

http://www.jianshu.com/p/25a319aee33d

Objective-C语言使用了面向对象特性和消息转发机制。

一:Runtime的数据结构:

解析:Root class其实就是NSObject,NSObject是没有超类的,所以Root class 的superclass指向nil;

每一个Class都有一个isa指针指向唯一的Meta class;

Root class(meta)的superclass指向Root class,也就是NSObject,形成一个回路;

每个Meta class的isa指针都指向Root class(Meta);

注意: 不论是示例对象还是Class,都是id类型的对象(Class同样是对象)

示例对象的isa指向它的Class(储存所有减法方法),Class对象isa指向元类(储存所有加好方法)

向一个对象(id)类型发送消息时,都是从这个对象的isa指针指向的Class中寻找方法

methodLists表示方法列表,他是指向objc_method_list结构体的二级指针,可以动态修改*methodLists的值来添加成员方法,也是category实现原理,同样也解析category不能添加示例变量的原因。

(二级指针相关阅读:http://www.fenesky.com/blog/2014/07/03/pointers-to-pointers.html)

@implementation Son : Father- (id)init
{    self = [super init];    if (self)
    {        NSLog(@"%@", NSStringFromClass([self class]));        NSLog(@"%@", NSStringFromClass([super class]));
    }    return self;
}@end

两个都是输出son,具体看文章解析。

二:关于消息转发机制:

关于这个的一些比较基础的用法可以在另外一个例子直接看到:

http://my.oschina.net/caijunrong/blog/508738

这三种方法的选择时机作者说:

Method Resolution:由于Method Resolution不恩能够像消息转发那样可以交给其他对象来处理,所以只能适用在 原来的类中替代掉;

Fast Forwarding:它可以将消息处理转发给其它对象,使用范围更广,不只是限于原来的对象;

Normal Forwarding: 它跟Fast Forwarding一样可以消息转发,单它能通过NSInvocation对象获取更多消息发送的信息,例如:target、selector、arguments和返回值等信息。

三:关于怎么使用Category对已存在的类别进行扩展,一般只能添加示例方法货类方法,因为二级指针的原因,而不适合添加额外的属性。虽然可以在category头文件中声明property属性,但在实现文件中编译器是无法synthesize任何示例变量和属性访问方法。这时需要自定义属性访问方法,并且使用Associatd Objects来给已经存在的类Category添加自定义的属性。

Associated Objects提供三个API来向对象添加、获取和删除关联值:

  void objc_setAssociatedObject (id object, const void *key, id value, objc_AssociationPolicy policy )
  id objc_getAssociatedObject (id object, const void *key )
  void objc_removeAssociatedObjects (id object )

笔试题:

iOS6级:

http://blog.sunnyxx.com/2014/03/06/ios_exam_0_key/

时间: 2024-10-26 04:48:29

iOS开发笔试面试- runtime的原理(一)的相关文章

iOS开发笔试面试- 编译原理

C/C++的编译器是集成的,编译一边分为4个过程: 1.预处理阶段 : 从hello.c变成hello.i文件,预处理一般就是将include或者define之类的东西,插入到代码中: 2.编译 : 从hello.i 变成hello.s文件,过程:检查语法.规范,在确定无误之后,将代码翻译成汇编语言. 3.汇编 : 从hello.s 变成hello.o文件,过程:将汇编代码转换成二进制文件. 4.连接 : 根据目标文件以及库文件,完成链接之后,生成可执行文件. 有用的地方:我们在开发的过程中,c

iOS开发笔试面试- KVC/KVO简单使用

转自:http://my.oschina.net/caijunrong/blog/510701 一.对于KVC模式(Key Value Coding): 1.其实在实际开发中用得比较多得就是:接收到json数据之后,通过解析,解析成NSDictionary,然后再把字典对应的字段建立一个Model,在Model里面自定义一个类方法+(instancetype)modelWithDictionary:(NSDictionary *)keyDictionary方法中调用 [self setValue

iOS开发笔试面试- KVC

对于KVC模式(Key Value Coding):其实在实际开发中用得比较多得就是:接收到json数据之后,通过解析,解析成NSDictionary,然后再把字典对应的字段建立一个Model,在Model里面自定义一个类方法+(instancetype)modelWithDictionary:(NSDictionary *)keyDictionary方法中调用 [self setValuesForKeysWithDictionary:jsonObject]; 从而达到我们想要的效果,将字典装成

iOS开发笔试面试- 数据类型

sizeof() int :4个字节 short int: 2个字节 long long int: 8个字节 float:4个字节 double:8个字节 char: 1个字节 char *: 8个字节 NSString: 8个字节 例子: struct baseValueStruct{ int age; char sex; float point; long long int momey; }; struct baseValueStruct baseStruct = {14, '2', 3.2

iOS开发--1.对runtime的理解和整理

在我以往的面试中常常会被问到runtime,开始本人其实对runtime只是个简单的了解,用过一些常用的功能,并未仔细研究.不过看来现在iOS开发越来越关注runtime了,所有工作之余仔细查看了一些大牛的博客.本篇文章只是对一些大牛博客的整理,还有一些自己对runtime的不成熟的理解,只是为了方便学习.希望大家多多指点批评 附带上大牛博客:onevcat的博客:runtime的博客 一:基本概念 Runtime简称运行时,基本是用汇编和C语言编写的,只是苹果为了动态系统的高效而作出的努力.点

Web前端开发笔试&面试_01(mi:)

—— (al_me16041719002000) begin—— 1.(单选)下面哪个方法是String对象和Array对象都有的? A.splice B.split C.replace D.concat E.sort F.join 2.(单选)以下说法错误的是? A.IE8支持 :before B.IE8支持 :after C.IE8支持 :first-child D.IE8支持 :last-child E.IE8支持 ::before F. IE8支持 ::after 3.(单选)以下框架采

iOS开发之使用Runtime给Model类赋值

本篇博客算是给网络缓存打个基础吧,本篇博客先给出简单也是最容易使用的把字典转成实体类的方法,然后在给出如何使用Runtime来给Model实体类赋值.本篇博客会介绍一部分,主要是字典的key与Model的属性名相同时,使用Runtime来进行赋值,下篇博客会给出字典key的值和Model的名字不同时的解决方案,并给出使用Runtime打印实体类属性值的方式. 当然你可以使用KVC的setValuesForKeysWithDictionary:方法,下面的方法也是一种解决方案.如果使用setVal

iOS开发-面试总结(十二)

1. 风格纠错题 修改方法有很多种,现给出一种做示例: 下面对具体修改的地方,分两部分做下介绍:硬伤部分和优化部分 .因为硬伤部分没什么技术含量,为了节省大家时间,放在后面讲,大神请直接看优化部分. 优化部分 1)enum建议使用 NS_ENUM 和 NS_OPTIONS 宏来定义枚举类型,参见官方的 Adopting Modern Objective-C 一文: 1 2 3 4 5 //定义一个枚举 typedef NS_ENUM(NSInteger, CYLSex) {     CYLSex

魔推mpush:IOS开发之数字证书及其原理

IOS开发者通常需要跟各种数字证书.公钥和密钥打交道.相信各位开发者经常会在开发的过程当中经常会被这些证书啊.密钥啊.公钥之类弄的心力憔悴了.今儿,就这个问题跟大家啰嗦两句关于IOS数字证书的问题. 什么是数字证书? 数字证书是互联网的数字形式的标识认证,与护照或驾驶证的智能非常相似.数字证书是一种凭据.提供了某个实体的标识和其他支持信息.数字证书由颁发机构(CA)的权威机构发布的.因此,该权威机构负责担保证书信息的有效性.而且数字证书通常情况下只在特定的时段内有效. 数字证书包含证书中所标识的