今天在掘金上看了一篇面试题 为 J_Knight_网友所写,想了想答案,还是写出来,巩固一下自己的知识吧
技术
基础
1.为什么说Objective-C是一门动态的语言?
要是这个都不知道就别说自己是搞iOS的了
2.讲一下MVC和MVVM,MVP?
真的是懒得写啦, 贴出来阮一峰老师的博客啦,讲的很清晰博客地址 不过说实话缺少之前不知道什么是MVP这个名词,看来自己很渣啊
3.为什么代理要用weak?代理的delegate和dataSource有什么区别?block和代理的区别?
delegate不用strong 就会和使用它的对象形成循环引用,这样就内存就不会释放,造成内存泄漏
delegate实际上就是设计模式中的委托模式,是一个类委托另一个类实现某个方法,当一个对象收到某个时间
或者通知是让代理对象接收到事件或者通知。dataSource就是数据源,管理代理过程中需要传递的数据
block 是运行在堆区 delegate 注重的是过程的传输,block 注重的是结果的传输。
4.属性的实质是什么?包括哪几个部分?属性默认的关键字都有哪些?@dynamic关键字和@synthesize关键字是用来做什么的?
属性的默认关键字:strong ,atomic
@dynamic 编译器不会自动创建get set方法
@synthesize 编译器会自动创建一个 _变量名的成员变量 用self.变量名 也可以使用 而且会自动创建get set方法
5.属性的默认关键字是什么?
(ps: 此题难道不是重4题 莫非你面试别人的时候对方用最经典的讨论说没听清你再说什么????)
6.NSString为什么要用copy关键字,如果用strong会有什么问题?(注意:这里没有说用strong就一定不行。使用copy和strong是看情况而定的)
使用copy 是为了安全,防止NSMutalbleString赋值给NSString 时,前者修改引起后者变化而用的
不用copy的话如果出现刚才说的这种情况,只是把NSMutalbleString 的地址赋给了NSString 如果NSMutalbleString需要修改的话 理论上上NSString 是不可以这么干的
7.如何令自己所写的对象具有拷贝功能?
要实现
8.可变集合类 和 不可变集合类的 copy 和 mutablecopy有什么区别?如果是集合是内容复制的话,集合里面的元素也是内容复制么?
可变集合已经实现了深度拷贝 所以是内容复制
9.为什么IBOutlet修饰的UIView也适用weak关键字?
因为他已经self.view 强引用,所以即使是weak 也不会释放
10.nonatomic和atomic的区别?atomic是绝对的线程安全么?为什么?如果不是,那应该如何实现?
atomic 不是强引用 如果想比较安全的用强引用 需要自己加锁
确实忘记了为啥atomic为什么不是绝对的线程安全了~~~(>_<)~~~
11.UICollectionView自定义layout如何实现?
惭愧啊,做过相关功能,但是都忘记了,看来还得不断整理以前搞过的~~~(>_<)~~~
大体上的套路就是指定好每个cell的尺寸与间距,然后交给控件自己排列
12.用StoryBoard开发界面有什么弊端?如何避免?
如果界面特别复杂的话,会是托线以及约束特别难以控制,基本上也只能自己维护了,其他人维护不了,而且SVN下特别容易起冲突
13.进程和线程的区别?同步异步的区别?并行和并发的区别?
好诡异,这种问题都问
14.线程间通信?
管道,信号量
15.GCD的一些常用的函数?(group,barrier,信号量,线程同步)
16.如何使用队列来避免资源抢夺?
为了避免多个线程同时访问一个数据,大体上有两种方法,一种是给资源加线程锁,一次只允许一个线程访问,其他的线程需要等待;或者给要要访问的线程加入一个串行队列中,顺序执行解决此问题
17.数据持久化的几个方案(fmdb用没用过)
plist 归档 偏好设置 sqllite coreData realm
18.说一下AppDelegate的几个方法?从后台到前台调用了哪些方法?第一次启动调用了哪些方法?从前台到后台调用了哪些方法?
请允许我打开了一个工程,名字太长,真是记不住
第一次启动: didFinishLaunchingWithOptions
前台进入后台:applicationDidEnterBackground
后台进入前台:applicationWillEnterForeground
19.NSCache优于NSDictionary的几点?
这条百度了。。。。
1.nscache 是可以自动释放内存的。
2.nscache是线程安全的,我们可以在不同的线程中添加,删除和查询缓存中的对象。
3.一个缓存对象不会拷贝key对象。
20.知不知道Designated Initializer?使用它的时候有什么需要注意的问题?
莫非这道题就是考察一些Designated Initializer? 能不能唬住面试者,跪舔,跪舔
自己加参数初始化ok 不过要想着父类的一些方法,属性,云云
21.实现description方法能取到什么效果?
nslog() 这个对象的时候能看到自己想要的信息,而不是指针
22.objc使用什么机制管理对象内存?
是想问ARC吗 自动引用计数??? 在编译的过程中,由编译器自动插入引用计数的增,减。
垃圾回收机制的区别??? 在运行期 由JVM 判断出哪个对象无用了,自动释放相关内存空间
中级
Block
1.block的实质是什么?一共有几种block?都是什么情况下生成的?
block 的实质是对象
block放在堆区 ,栈区,代码区 (ARC 把栈区的放到堆区 )
如果block 不引用外部变量 那么他就在代码区
如果用了就会把他放到堆区, 所以如果想用它必须用copy 指向他,如果用strong 就跪了,变成野指针了
2.为什么在默认情况下无法修改被block捕获的变量? __block都做了什么?
因为普通变量是在放到栈区的,block 运行的时候是在堆区的,所以无法直接使用,__block 是一个结构体,可以里面存了变量的指针,传到block中其实是传的指针,所以就可以修改了
3.模拟一下循环引用的一个情况?block实现界面反向传值如何实现?~~~(>_<)~~~
Runtime
1.objc在向一个对象发送消息时,发生了什么?
通过对象的isa找到对象的ID,然后查询对象的方法列表 ,如果没有要执行的方法则沿着ISA寻找父类,一层一层的寻找方法列表,如果找到了就发送消息 始终没找到就会报错
2.什么时候会报unrecognized selector错误?iOS有哪些机制来避免走到这一步?
对象执行方法,或者发送消息时,没有这个方法,就会报错
弥补方法,其实也不是查询不到方法直接报错,如果找不到的话,会执行resolveInstanceMethod 方法给你弥补的方法,如果你能捕获到这个方法也不会报错,如果没捕获到还有forwardingTargetForSelector重定向方法可以告诉系统你可以用什么方法代替,如果还不行,就会报错误崩溃了。
3.能否向编译后得到的类中增加实例变量?能否向运行时创建的类中添加实例变量?为什么?
编译器结束后类 objc_ivar_list 的链表内存的size 已经固定无法添加变量
在运行期可以通过runtime机制添加变量
4.runtime如何实现weak变量的自动置nil?
把weak变量放到一个hash表中,以内存地址为key,如果该对象释放,会把这个key 映射的value 置nil
5.给类添加一个属性后,在类结构体里哪些元素会发生变化?
instance_size :实例的内存大小
objc_ivar_list *ivars:属性列表
RunLoop
1.runloop是来做什么的?runloop和线程有什么关系?主线程默认开启了runloop么?子线程呢?
runloop运行循环保证程序执行完后不退出,可以接受timer 触摸灯事件
每个线程都有一个runloop 可以保证线程的执行
主线程默认开启,子线程默认不开启
2.runloop的mode是用来做什么的?有几种mode?
mode 是runloop的模式不同的模式 runloop处理起来会不一样
系统默认注册了5个mode
kCFRunLoopDefaultMode: 默认模式 通常主线程下运行的
UITrackingRunLoopMode 用scrollView 追踪滑动模式保证滑动时其他的不受影响
UIInitializationRunLoopMode 初始化时使用然后不用了
GSEventReceiveRunLoopMode 接受内部事件的模式,通常不用
kCFRunLoopCommonModes
3.为什么把NSTimer对象以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)添加到主运行循环以后,滑动scrollview的时候NSTimer却不动了?
nstimer 默认是NSDefaultRunLoopMode 模式,当处理滑动时切换到了UITrackingRunLoopMode 滑动的模式所以就不会接收事件了,如果想接受,就改一下模式
4.苹果是如何实现Autorelease Pool的?
相当于缓存池的作用,加入到缓冲池的对象,不会马上释放,当等到作用域结束的时候回把所以的对象引用计数-1
类结构
1.isa指针?(对象的isa,类对象的isa,元类的isa都要说)
####2.类方法和实例方法有什么区别?
类方法: 类方法必须使用类调用,方法里不能有属性,也必须调用类方法,不能调用实例方法 存储在元类结构体里面的 methodLists 里面
实例方法:必须为实例对象调用,可以调用属性,存储在类结构体的methodLists 里面
####3.介绍一下分类,能用分类做什么?内部是如何实现的?它为什么会覆盖掉原来的方法?
给无论是否有源码都可以给类添加实例方法,会被添加到类方法的methodList 列表里面。 系统加入到methodLists的时候会把分类的名字放到前面,在便利对应名字的时候找的时候会优先找到分类里的方法
####4.运行时能增加成员变量么?能增加属性么?如果能,如何增加?如果不能,为什么
可以增加成员变量 objc_setAssociatedObject objc_getAssociatedObject 不会生成下划线的的成员变量 getter setter方法需要自己实现
####5.objc中向一个nil对象发送消息将会发生什么?(返回值是对象,是标量,结构体)
会返回0 或者null
#高级
####1.UITableview的优化方法(缓存高度,异步绘制,减少层级,hide,避免离屏渲染)
**缓存高度**:请求数据的时候就把高度算好
异步绘制:
**减少层级**:因为cell 默认已经创建好了一些控件,最好能服用,不要单独创建,还有不要把cell的设计的太复杂
**hiden**:所有的控件都是必须先创建好了,在控制显隐,
**避免离屏渲染**: 尽量少使用圆角啥的 这样会造成离屏渲染,增加消耗;
####2.有没有用过运行时,用它都能做什么?(交换方法,创建类,给新创建的类增加方法,改变isa指针)
交换方法,创建类,添加方法,添加实例变量,
####3.看过哪些第三方框架的源码?都是如何实现的?(如果没有,问一下多图下载的设计)
####4.SDWebImage的缓存策略?
加载图片的时候,先会在内存里查找,如果没有,就会根据图片的URL的md5值去沙盒里面寻找,如果还是找不到,就会开辟线程去下载,下载完毕后加载到imageView上面 并把图片以URL的md5存起来
####5.AFN为什么添加一条常驻线程?
常驻现场是起到下载用的,如果不开辟的话,每次需要下载都要单独开线程,下载完还释放,这样会消耗很大资源,所以开辟一条常驻线程,这样可以避免浪费,每次请求的时候都会用这条线程
####6.KVO的使用?实现原理?(为什么要创建子类来实现)
kvo 其实就是键值观察 ,使用了观察者模式
监听的时候会创建子类,重新时间需要观察的值,在上面添加一堆方法,例如当值要改变之前,之后的方法,然后类的ISA指针也是观察的是新类,其实观察的是runtime创建的新类,如果当新类改变了后就会通知通知观察者
####7.KVC的使用?实现原理?(KVC拿到key以后,是如何赋值的?知不知道集合操作符,能不能访问私有属性,能不能直接访问_ivar)
键值赋值,最多的时候就是字典模型之间的转换 runtime可以获取类的所有的成员变量然后通过此性质给挨个赋值,就可以达到目的,可以访问私有属性,在kvc中是不分_ 他会先寻找不带_的属性,再访问_的 如果都获取不到会报错
后面的这些吧就是不是知识性的 因人而异,今天已经耽误了好多工作时间了,后续再答,总体的感觉,虽然之前也刷了不少题,答题前以为信心满满,但是写的时候还是有很多要不然想不起来,要不然记得比较模糊,看来还是知识不够扎实 ,要继续努力啊
[原题目](https://juejin.im/post/5938dfdb8d6d810058481572?utm_source=gold_browser_extension)
无独有偶,后来查答案的时候看到了有大神的答题,觉得比如这个弱鸡强多了,在这也先附上网址让我跪舔一下
[大神答案](http://www.qingpingshan.com/rjbc/ios/280109.html)
项目
有已经上线的项目么?
项目里哪个部分是你完成的?(找一个亮点问一下如何实现的)
开发过程中遇到过什么困难,是如何解决的?
学习
遇到一个问题完全不能理解的时候,是如何帮助自己理解的?举个例子?
有看书的习惯么?最近看的一本是什么书?有什么心得?
有没有使用一些笔记软件?会在多平台同步以及多渠道采集么?(如果没有,问一下是如何复习知识的)
有没有使用清单类,日历类的软件?(如果没有,问一下是如何安排,计划任务的)
平常看博客么?有没有自己写过?(如果写,有哪些收获?如果没有写,问一下不写的原因)
有关技术类的问题可以在评论区留言,我重点说一下这轮面试的心得和体会。