iOS面试题04-runtime

runtime/KVO等面试题

1.KVO内部实现原则

回答:1>KVO是基于runtime机制实现的

   2>当某个类的对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的setter方法。

派生类在被重写的setter方法实现真正的通知机制(Person->NSKVONOtifying Person)

Person类对象p设置self控制器且设置监听属性,就会调用observeValueForKeyPath方法,当Person类的属性被改变时,就会动态生成一个子类继承自Person类(NSKVONotifying_Person),重写setAge方法,内部调用父类setAge方法,通知监听器

[监听器  observeValueForKeyPath:@"age" ofObject:self change:@{} context:(void *)context];

原先age属性不改变时p对象 isa指向Person,当age属性改变时p对象 isa指向NSKVONotifying_Person(setAge重新内部就会传递变量至父类且通知监听器age属性改变)

2.是否可以把比较耗时的操作放在NSNotificationCenter中

回答:1>如果在异步发送通知,那么可以执行比较耗时的操作

2>如果在主线程发送通知,那么就不可以执行比较耗时的操作

图--2

图---1

3.Foundation对象与Core Foundation对象有什么区别

回答:1>Foundation对象是OC的,Core Foundation是C语言对象

2>Foundation对象和Core Foundation对象可以互相转换的,数据类型之间的转换

ARC:__bridge_retained/__bridge_transfer

非ARC:__bridge

4.不用中间变量,用两种方法交换A和B

回答:A= A + B

B= A -B

A = A - B

或者

A= A^B

B = A ^ B

A = A^B;

5.简单描述下对单例模式设计的理解?

回答:节省内存资源,一个应用就一个对象

6.什么是动态,举例说明

1>在程序运行过程才执行的操作,例如KVO的内部实现原理,一个类的属性值随着程序运行监听属性值的变化

7.runtime实现机制是什么,怎么用,一般用于嘛,你还能记得你所使用的相关头文件或者某些方法的名称吗?

回答:运行时机制,runtime库里面包含了跟类/成员变量/方法相关的API,比如获取类里面的所有成员变量,为类动态添加成员变量,动态改变类的方法实现,为类动态添加新的方法等,需要导入<objc/message.h><objc/runtime.h>

1>runtime,运行时机制,它是一套C语言库

什么是runtime?

2>实际上我们编写的所有OC代码,最终都是转成了runtime库的东西,比如类转成了runtime库里面的结构体等数据类型,方法转成了runtime库里面的C语言函数,平时调方法都是转成了objc_msgSend函数(所以说OC有个消息发送机制)

3>因此,可以说runtime是OC的底层实现,是OC的幕后执行者

runtime有啥用?

1>能动态产生一个类、一个成员变量、一个方法

2>能动态修改一个类、一个成员变量、一个方法

3>能动态删除一个类、一个成员变量、一个方法

常见的函数、头文件

#import <objc/runtime.h> : 成员变量、类、方法

class_copyIvarList : 获得某个类内部的所有成员变量

class_copyMethodList : 获得某个类内部的所有方法

class_getInstanceMethod : 获得某个具体的实例方法(对象方法,减号开头)

class_getClassMethod : 获得某个具体的类方法 (加号)

method_exchangeImplementations : 交换2个方法的实现

#import <objc/message.h> 消息机制

objc_msgSend(...);

图解:平时用OC代码设置变量值都转成如下图所示

图解:runtime机制可以看到很底层的实现,甚至成员变量是私有的。

图解:runtime实现遍历所有成员变量

图解:使用runtime机制,UIImage类交换2个方法的实现(imageWithName和imageNamed)

但是如果在imageWithName方法内在调用imageNamed就会导致死循环。

交换2个方法的好处:以后一个大项目当中的一个方法使用过多,想动一些手脚和操作,就可以很方便实现。

图解:修改addObject方法不为空才添加到数组

图解:修改objectAtIndex方法并查看是否越界,如越界返回null,runtime还可防止程序崩溃

附注:self.book[4]执行实际调用objectAtindex方法。

时间: 2024-08-06 11:53:54

iOS面试题04-runtime的相关文章

iOS笔试题04

1. Object-C有多继承吗?没有的话用什么代替?? 1> OC是单继承,没有多继承 2> 有时可以用分类category和协议protocol来代替多继承 2. Object-C有私有方法吗?私有变量呢?? 1> OC没有类似@private的修饰词来修饰方法,只要写在.h文件中,就是公共方法 2> 可以使用类扩展(Extension)/继承来增加私有方法和私有变量 3. 关键字const什么含义? const int a; int const a; const int *a

iOS面试题系列之Objective-C相关

1.简述你项目中常用的设计模式.它们有什么优缺点? 常用的设计模式有:代理.观察者.单例. (1)单例:它是用来限制一个类只能创建一个对象.这个对象中的属性可以存储全局共享的数据.所有的类都能访问.设置此单例中的属性数据. 优点:是它只会创建一个对象容易供外界访问,节约性能. 缺点:是一个类只有一个对象,可能造成责任过重,在一定程度上违背了"单一职责原则".单例模式中没有抽象层,所以单例类的扩展有很大的困难.不能过多创建单例,因为单例从创建到程序关闭前会一直存在,过多的单例会影响性能,

IOS面试题&lt;转&gt;

前言 写这篇文章的目的是因为前两天同学想应聘iOS开发,从网上找了iOS面试题和答案让我帮忙看看.我扫了一眼,倒吸了一口冷气,仔细一看,气的发抖.整篇题目30多个没有一个答案是对的,总结这篇面试题的作者对iOS机制根本就是一知半解就敢发到网上,不管有心还是无心都是坑害新人.所以在这里总结一下这几年面试别人和被别人面试遇到的一些我认为比较好的基础题目分享给大家,进阶题目在后续补充.我的理解如果有错漏请一定指出,非常感谢! 从12年开始做面试官到现在已经三个年头了,这期面过很多形形色色的开发,有腾讯

半年努力,我终于把这100家企业iOS面试题整理完了(附答案)!

####100家知名企业今年来iOS面试题合集: 你要的这里都有: 企业要的这里也有: 从基础开始到进阶.深入底层 整理出188个面试题,全是干货 这些全部是题目跟类目,每个题目都会有相对的答案,由于字数太多所以我整理出一个文档,文档获取地址,作者创建的iOS行业交流群:763164022,加群在群文件下载 ####目录展示: 1.swift和oc的区别2.编译链接3.synthesize & denamic4.在项目开发中常用的开发工具有哪些?5.UITableView & UIColl

iOS小技巧--用runtime 解决UIButton 重复点击问题

iOS小技巧–用runtime 解决UIButton 重复点击问题 什么是这个问题 我们的按钮是点击一次响应一次, 即使频繁的点击也不会出问题, 可是某些场景下还偏偏就是会出问题. 通常是如何解决 我们通常会在按钮点击的时候设置这个按钮不可点击. 等待0.xS的延时后,在设置回来; 或者在操作结束的时候设置可以点击. - (IBAction)clickBtn1:(UIbutton *)sender { sender.enabled = NO; doSomething sender.enabled

最全的iOS面试题及答案-转载

1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? 答: Object-c的类不可以多重继承:可以实现多个接口,通过实现多个接口可以完成C++的多重继承:Category是类别,一般情况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系. 2. #import 跟#include 又什么区别,@class呢, #import<> 跟 #import””又什么区别?

iOS面试题之加载单张图片到底会不会崩溃?

今天,一哥们去某公司面试iOS职位.其中一道题目问,加载一张图片,到底会不会崩溃呢? 我拿到这个问题,当时以为是获取网络图片,那还是可能崩溃的,但实际问题,还有半句,图片是本地的... 这问题,加载本地的怎么会崩溃呢?写这么久加载图片也没遇到如此问题. =================================================== 原来,iPhone毕竟是手持设备,它所占有的内存是有限的,当图片过大的时候会引起内存导致的崩溃现象. 后来,我又查了下,发现,原来还有这么大学

iOS面试题 第一天

今天上午,下午分别面试了两家公司.上午是一家互联网公司,气氛还比较好,是我比较喜欢的.技术这块是直接机试,主要是给了些BUG让我修复,整个过程还算顺利.下午去了一家大型的证券公司.整理技术问题如下: 1. UIView的生命周期是什么样的,执行顺序是怎么样的?init -- loadView -- viewDidLoad -- viewWillAppear -- viewWillDisappear -- viewDidUnload -- dealloc. 2. UIViewController在

iOS 面试题 总结

#include <iostream> using namespace std; int main () { char p[]={'a','b','c'}, q[]="abc"; printf("%d %d\n",sizeof(p),sizeof(q)); //getch(); } //结果 3,4 sizeof有什么作用呢? sizeof是C语言的关键字不并不是函数,这个很容易被忽略 sizeof(a)表示a在内存中所占的字节数 以下是windows

iOS 面试题:OC基本概念题

1.什么是类和对象? 类是一组具有同样特征和功能的事物的抽象 对象描写叙述了一个物体的特征和行为实现 类是对象的抽象 对象是类的实例 2.OC中定义类,创建对象,使用对象. OC中定义类分为接口部分,实现部分 接口部分:对外声明类的特征和行为 实现部分:实现方法,即类的行为实现 创建对象须要进行分配内存空间和初始 3.声明方法,依据需求.区分:方法声明,方法实现,方法运行 4.继承.继承的全部特点 子类能够继承父类全部的声明的方法和除私有的以外实例变量 父类不能使用子类所创建的方法和实例变量 5