iOS面试前的准备

在iOS行业如此饱和的今天,跳槽是需要勇气的(ps裸辞),如此就要做好充足的准备。

怎么大风越狠,我心越荡

保持信心,一路向前。
生于忧患死于安乐,这句话还是很有道理的。
废话不多说了,还是直接来点实际的,如下是我准备的一些问题及相应的个人理解(集各路英雄豪杰的总结),也是觉得面试官会问的技术点:

一. loadinitialize的异同

load类方法是类加载进内存的时候调用一次,分类中若实现了load方法,也会被调用,且当前类的load方法会先调用,分类中的load方法后调用,不支持子类重写。
initialize是类在第一次使用时会调用一次,调用其子类时,父类的initialize会被先调用,支持重写。
在这两个方法中都不建议做一些负载的操作,以防止程序运行或加载时出现阻塞的现象。

二.GCDNSOperationQueue在实际项目中如何进行选择

首先NSOperationQueue有如下的一些特新

  • 取消某个操作,调用cancel方法,会设置对象内的标志位,用以表明下次任务不需执行。
  • 可以指定操作间的依赖关系。
  • 通过KVO监控NSOperation对象的属性,可以判断任务是否取消及任务是否已完成。
  • 指定操作的优先级。
  • 重用NSOperation对象,实现自定义操作任务。

然而GCD也有它的优势,主要内部是基于C语音的一套封装,调用的方法更底层,运行的速度也会更快。如果需要用到异步线程加载一些任务,且不需要用到NSOperation的那些特性,首选还是用GCD的。
GCD也有自己的特性:

  • 通过Dispatch Group机制,根据系统资源来执行任务。
  • 运用Dispatch Barrier特性,保证写入数据的线程安全。
  • 运用Dispatch Once来创建多线程下安全的单例。

两个的相同点都是操作队列,实现多线程任务管理。

三. UITableView的优化(防止卡顿)

1.主线程是用来更新UI的,若来处理与UI更新无关的事情,就会出现卡顿。(值得注意)
2.将计算cell高度的过程在获取数据时就直接计算保存好,代理方法需要的时候,直接从模型中获取。
3.图片的部分最好做缓存,避免读I/O操作。
4.网络加载下来的图片尺寸最好跟显示的frame尺寸匹配,避免控件去压缩图片。
5.cell的复用机制。
6.避免设置控件的圆角,防止离屏渲染。
7.避免设置控件的透明度alpha
8.对于UILabel的显示,避免设置富文本。
9.UI的布局最好不要用Xib和SB,反正系统做一些不必要的操作,最好手动布局。
10.避免代理方法里面文字size的计算。

四.weak的内部实现

weak表明属性是一种非拥有关系,为这种属性设置新值时,设置方法既不保留新值,也不释放旧值。此特性与assign类似,但是当所指的对象的引用计数为0时,会执行dealloc操作,将weak属性设置为nil
runtime特质,系统会将所有weak属性存在一个hash表中,将weak属性所指的对象的内存地址作为key,当weak所指向的对象被清空时,系统会通过清空对象的内存地址key,从hash表中获取weak属性,将其赋值为nil

五.copy关键字怎么用

1.copy特质:父类指针可以指向子类对象,为了保持属性不受外界的影响,无论外面给我传的是可变的或不可变的对象,都会保持一份不可变数据的副本。
2.strong特质:当不可变的对象指向可变的子类对象时,只是增加了当前对象的引用计数,可变的对象和不可变的对象指向同样的地址空间,当可变对象的值发生变化时,同时会影响不可变的对象。
copy此特质所表达的所属关系与strong类似。然而设置方法并不保留新值,而是将其“拷贝”,当属性的类型为NSString时,经常用此特质来保护其封装性,因为传递给设置方法的新值有可能指向NSMutableString类的实例,这个类是NSString的子类,表示一种可修改其值的字符串,此时若是不拷贝字符串,那么设置完属性之后,字符串的值就可能在对象不知情的情况下被篡改。所以,这时就要拷贝一份不可变的字符串,确保对象中的字符串的值不被无意间改动。只要实现所用的对象是可变的,就应该在设置新属性值时拷贝一份。

六.事件的传递和响应

当一个事件发生后,事件会从父控件传给子控件,也就是由UIApplication->UIWindow -> UIView -> initial view,以上就是事件的传递,也就是寻找最合适的view的过程.
事件的响应,首先看initial view能否处理这个事件,如果不能则会将事件给其上级的视图(initial viewsuperView);如果上级视图任然无法处理则会继续往上传递,一直传递到视图控制器view controller,首先判断视图控制器的根视图view是否能处理此事件,如果不能则接着判断该视图控制器能否处理此事件,如果还是不能则继续向上传递,(对于第二个视图控制器本身还在另一个视图控制器中,则继续交给父视图控制器的根视图,如果根视图不能处理则交给父视图控制器处理),一直到window,如果window还是不能处理此事件则继续交给UIApplication去处理,如果最后UIApplication还是不能处理此事件则将其丢弃.
区别:事件的传递是从上到下(父控件到子控件),事件的响应是从下到上(顺泽响应链条向上传递),子控件到父控件.

七.动态库和静态库的区别

在实际的编程过程中,通常会把一些公用的函数制作成函数库,供其它程序使用,一是提高了代码的复用,二则提高了核心技术的保密程度.所以在实际的项目中经常会使用到函数库,即函数库又分为静态库和动态库.这里所谓的动态库和静态库是相对编译期和运行期的.
静态库在程序编译时会被链接到目标代码中,程序运行时将不再需要改静态库.
动态库在程序编译期间不会被链接到目标代码中,只是在程序运行时才被载入,在程序运行期间还需要动态库的存在.

八.runtime的介绍

runtime是一套底层C语言的API,包含许多强大的C语言函数,OC的函数调用,底层都会调用runtime函数.
作用:可以获取当前对象的所有成员变量,方法名;可以动态的给对象添加属性和方法.利用黑魔法(Method Swizzling)交换两个方法的实现等.
objc_setAssociatedObject给关联对象添加属性
objc_getAssociatedObject获取关联对象的属性

九.什么时候会报unrecognized selector的异常

objc在向一个对象发送消息时,runtime库会根据对象的isa指针找到该对象实际所属的类,然后在该类中的方法列表及其父类的方法列表中寻找方法的运行,如果最顶层的方法中依然找不到相应的方法时,程序在运行时会挂掉同时抛出异常unrecognized selector sent to XXX.但是在这之前,objc的运行时会给出三次拯救程序奔溃的的机会:
1.Method resolution
objc运行时会调用+resolveInstanceMethod:+resolveClassMethod:,让你有机会提供一个函数实现.如果你添加了函数,运行系统会重新启动一次消息发送的过程.否则,运行时会移到下一步,消息转发(message Forwarding)
2.Fast forwarding
如果目标对象实现了-forwardingTargetForSelector:,runtime这时就会调用这个方法,给你把消息转发到其它对象的机会.只要这个方法返回的不是nil和self,整个消息发送的过程就会重启,发送的对象就会变成你返回的那个对象.否则,就会继续Normal Forwarding.
3.Normal Forwarding
这一步是runtime最后一次给你挽救的机会,首先它会发送-methodSignatureForSelector:消息获得函数的参数和返回值类型.如果-methodSignatureForSelector:返回的是nil,runtime就会发出-doesNotRecognizeSelector:消息,程序这时也就挂掉了.如果返回了一个函数签名,runtime就是创建一个NSIvocation对象并发送-forwardInvocation:消息给目标对象.

十.UIViewCALayer的区别和联系

1.UIView可以响应事件,CALayer不可以
UIView继承自UIResponder,具有响应事件的能力.
2.UIView主要是对显示内容的管理而CALayer主要是侧重对显示的绘制.
3.在iOS动画的时候,修改非RootLayer的属性会默认产生隐式动画,而修改UIView则不会.

目前先整理这些,貌似都是些概率的东西,后续待继续更新...
若有好的面试题目,待各位在评论中指出,表示会及时更新上去.自己也会在平时的开发中多积累一些...

整理多了,也是一份不错的笔记...

收获自己,分享大家...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,134评论 30 470
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,811评论 25 707
  • 在参加工作后,我一直有个习惯,就是睡前看书。我会在枕头边放上一叠书,上床后,捧上一本书,看上三四页,然后困了,就熄...
    小钱儿可虎了阅读 207评论 0 2
  • 新项目下周就要上线,所以这段时间一直在关注冷启动的话题。我没有正儿八经做过用户或产品运营,但深知一款新产品上线,在...
    涂涂小排屋阅读 753评论 1 5
  • 1. 打开模拟器 2.找到Hardware 打开 3. 选中Keyboard 4 第二个勾号 勾掉
    骑驴去旅行阅读 546评论 0 0