没想到支付宝会打电话来面试,面试了半个小时,好悬
前面开始问的是项目,然后介绍了以前项目的框架,聊到MVC,这些都是没答案的,我就不提我自己的回答了,
1.后面问了OC为什么会叫发送消息?
我的回答:实例调用方法在运行时会调用objc_msgSend函数,msgSend函数有两个固定参数,id,SEL,这个函数是用汇编实现的,大致是会去 找SEL的实现,函数指针IMP,找不到就返回_objc_msgForward函数指针,这个函数实现也看不到,根据文档这个函数实现消息转发做了如下几件事,
a.调用resolveInstanceMethod:方法,允许用户在此时为该Class动态添加实现。如果有实现了,则调用并返回。如果仍 没实现,继续下面的动作。
b.调用forwardingTargetForSelector:方法,尝试找到一个能响应该消息的对象。如果获取到,则直接转发给它。如果返回了nil,继续下面的动作。
c.调用methodSignatureForSelector:方法,尝试获得一个方法签名。如果获取不到,则直接调用doesNotRecognizeSelector抛出异常。
d.调用forwardInvocation:方法,将地3步获取到的方法签名包装成Invocation传入,如何处理就在这里面了。
上面这4个方法均是模板方法,开发者可以override,由runtime来调用。最常见的实现消息转发,就是重写方法3和4,吞掉一个消息或者代理给其他对象都是没问题的。类方法类推。
2.后面问了runloop的作用,
我的:runloop就是在线程中管理事件异步到达的设备。貌似就是英文官方翻译了下,
3.继续问了以+ scheduledTimerWithTimeInterval.的方式触发的timer,在滑动页面上的列表时,timer会暂定回调,为什么?如何解决?
我的:用sche创建的是在主线程是默认的模式下运行的,当滚动列表的时候runloop是运行在tracking的一个模式下,所以默认模式下的timer是不会执行,
解决,把timer加到common的一个模式下,这个是一个模式集合,包括默认的模式,和tracking的模式,
4.runloop怎么知道是当前循环或者下一个循环?
我的,这个不清楚是什么意思。我就答了个,runloop类似想select多路复用io技术,然后...
5.后面问了浅拷贝深拷贝
我的,浅拷贝是拷贝指针,深拷贝是新开辟空间,把里面的类容拷贝出来。举例用了c结构体带指针的例子。
6.开始问了#include #import区别
我的,#include不会检查重复包含,#import会检查,
用#include 怎么解决重复包含
我的,用#ifdef 与预处理判断
继续延伸要@class和#import
我的,@class在编译期间不会引入头文件,效率较高
7.c++指针和引用的区别和联系
我的,引用本质就是const 指针,1.区别,指针可以改变指向,引用不行
2.c++中在一个函数里面,返回指针和返回引用有区别,返回引用会调用拷贝构造函数。
8.后面问了iOS中用了哪些设计模式
我的,回答这个问题的时候,设计模式已经忘的差不多了,面试就没准备过,就回答了个单例,和工厂,
后续问了工厂有个什么鬼东西的区别,没听说过,直接忘记了
9.问了类图的哪5个什么东西的?
我的,忘了,回答了个聚合和组合,
两者之间的区别,不清楚胡乱回答的,从大二上了这个后就没整过,真心不知道
10,tableview的优化,
我的,这个回答的不是很好,cell的重用不用说了,cell要自定义draw,通过有很多图片,怎么优化?我当时是考虑的预见加载一部分图片,
面试官立马又问,如果快速拖动呢,
我的,拖动的快慢可以用代码计算出来,然后根据最上面那个cell预先加载到内存。
11,图片从内存渲染到界面上有哪些技术实现细节?
中途还问了绘制图片哪些优化?,我说了用gpu加速绘制等,
我的,这个不是很清楚什么意思,
还问了个autorelease延迟释放以及pool的原理,这个回答不好,只是说了个大概
想想还有什么遗漏了的,记不清楚了,前后差不多半个小时
后面就等通知
设计模式和类图这一块确实没想到会问到,o了,共勉!!
网友评论