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方法。
iOS面试题04-runtime的更多相关文章
- iOS笔试题04
1. Object-C有多继承吗?没有的话用什么代替? 1> OC是单继承,没有多继承 2> 有时可以用分类category和协议protocol来代替多继承 2. Object-C有私 ...
- 李洪强iOS经典面试题156 - Runtime详解(面试必备)
李洪强iOS经典面试题156 - Runtime详解(面试必备) 一.runtime简介 RunTime简称运行时.OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制. 对于C ...
- 试答卓同学的 iOS 面试题
卓同学昨天写了一篇文章<4道过滤菜鸟的iOS面试题>.我手痒决定默写一个参考答案.后来发现不认真回答被大家喷成狗,所以决定积极改造,重新做人.下面就是修编之后的答案. 1. struct和 ...
- iOS面试题大全-点亮你iOS技能树
所有的内容大部分来自于网络的搜集,所以我不是一个创造者,而是一个搬运工.我尽量把题目,尤其是参考答案的出处列明.若有任何疑问,建议,意见,请联系我. 第一部分面试题来源于iOS-Developer-I ...
- ios 面试题 经典(比较全) 根据重点总结
史上最全的iOS面试题及答案 1.写一个NSString类的实现 + (id)initWithCString:(c*****t char *)nullTerminatedCString encodin ...
- YouKu iOS笔试题一
序言 最近收到某某同学将去youku的iOS笔试题的邮件,希望笔者能整理一下,并提供参考答案.笔者决定整理出来,并分享给大家.当然,与此同时,也想看看youku的笔试题到底有多难,也考考自己有多少料吧 ...
- ios面试题1
iOS面试题 1.写一个NSString类的实现 + (id)initWithCString:(c*****t char *)nullTerminatedCString encoding:(NSS ...
- 大厂常问iOS面试题--多线程篇
1.进程与线程 进程: 1.进程是一个具有一定独立功能的程序关于某次数据集合的一次运行活动,它是操作系统分配资源的基本单元. 2.进程是指在系统中正在运行的一个应用程序,就是一段程序的执行过程,我们可 ...
- 大厂常问iOS面试题--性能优化篇
1.造成tableView卡顿的原因有哪些? 1.最常用的就是cell的重用, 注册重用标识符 如果不重用cell时,每当一个cell显示到屏幕上时,就会重新创建一个新的cell 如果有很多数据的时候 ...
- 2020年,大厂常问iOS面试题汇总!
Runloop & KVO runloop app如何接收到触摸事件的 为什么只有主线程的runloop是开启的 为什么只在主线程刷新UI PerformSelector和runloop的关系 ...
随机推荐
- HTML5学习笔记之Input类型
Input类型——email email类型用于包含email地址的输入域,在输入地址时会自动验证email域的值 例:Email:<input type="email" n ...
- Yahoo团队经验:网站性能优化的34条黄金法则
Yahoo团队总结的关于网站性能优化的经验,非常有参考价值.英文原文:http://developer.yahoo.com/performance/rules.html 1.尽量减少HTTP请求次数 ...
- MMC卡是什么
MMC卡(Multimedia Card) 翻译成中文为“多媒体卡”.是一种快闪存储器卡标准.在1997年由西门子及SanDisk共同开发,技术基于东芝的NAND快闪记忆技术,因此较早期基于Intel ...
- delphi写的整合汇编与api的简单的窗口程序
program Project1; { Types and Structures Definition }type WNDCLASSEX = packed record cbSize: Lon ...
- Java 处理json经常使用代码
本project代码已上传至资源,如有须要,请自行下载. package com.michael; import static org.junit.Assert.assertEquals; impor ...
- Mongodb数据库命令端经常使用操作
数据库基本命令操作 数据库经常使用命令 1.Help查看命令提示 help db.help(); db.yourColl.help(); db.youColl.find().help(); rs.he ...
- 【iOS】Plist-XML-JSON数据解析
网络上数据传输通用的有XML.JSON等,iOS中也能够用Plist. 要进行传输数据.就要首先进行序列化: 1.序列化. 对象转换成二进制流.(这个一句话即可) .反序列化. 二进制流转换为对象等 ...
- JQuery让input从disabled变成enabled
JQuery让input从disabled变成enabled document.getElementByIdx_x("removeButton").disabled = false ...
- Bootstrap学习之一起步
说起Bootstrap,第一次接触到这个名词的时候还是同事在做自适应页面技术分享会时了解到,在之后的项目中就逐渐应用了这个前端WEB CSS框架.
- Ubuntu常用命令整理
最近开始用Ubuntu系统了,各种命令很不熟练,想收集一下,以便以后查阅,用这个时常更新的随笔 1.Ubuntu设置与修改用户密码 设置ROOT密码方法:sudo passwd root ,然后输入密 ...