iOS面试题(个人心得体会)1

面试题

1.面向对象的理解

面向对象有三大特征:封装、继承和多态

封装是指类把所有的操作封闭起来,仅仅提供接口让其他人使用,使用的人没有必要知道实现的方法,只需要知道如何使用该接口就行了

继承是指一个类继承了一个父类,那么该子类就有了其父类的所有特性,同时该子类也可以自行添加自己独有的功能

多态,简单来说就是不同对象面对同样方法的时候会出现不同的响应方式

2.多线程

首先多线程一般的用处是在异步加载的时候,即在出现需要时间去处理的时候,这时候使用多线程不会阻塞主线程,能在主线程流畅运行的同时去异步加载一些图片啊,视频等,而这里的图片加载就会被放到线程中去,关于线程,一个进程至少有一条线程,进程和线程本质的区别就是进程拥有独立的内存空间,线程没有。像刚才的例子,能知道多线层的有点在于提高程序的执行效率,缺点是需要占用一定的内存空间,这里是开辟本身的内存空间给线程。而如果下载数量多了,即时用多线程还是会导致线程的阻塞。

3.循环引用

遇到过,最深刻的是在使用block的时候,在block函数里面使用block,导致重复的引用。还有就是在开始使用代理的时候,定义代理用的是strong方法,这个导致在每一次引用到该协议的代理的时候都将他的引用计数+1了。导致内存泄露。后来就一直使用assign

4.数据的持久化

在普通时候使用 write to 直接写入的方式,这里是保存字符串或者数组之类的对象

在多数据的时候是使用对象归档的方式(NSKeyedArchiver),但这种方式最大的缺陷是每一次的存储或者调用都需要将整个保存文件解档或归档,对系统的花销很大,在数据不大的情况下还是没问题的,可如果数据多了,最好还是使用数据库SQL的方式,数据库提供增删改查的方式,直接对该数据进行操作,但缺点就是数据库编写麻烦,且使用的是C语言,没有和OC好的结合

5.cocoapods的使用

有使用过,在开发中经常用到的是AFNetWork、SDWebImage以及FMDB,这些第三方类库的使用可以大大减少代码的编写量,同时他们也是经过沉淀的成熟的类库,也是很适合去借鉴学习的。

6.present 和push 的区别

两个的作用都是进入下一个页面,唯一不同的是push会将下一个页面压入栈中,这在有导航栏的时候作用最明显,被压入栈中的页面只会执行一次videDidLoad,之后便被保存起来,而present是直接跳转,重新执行页面中的方法,返回上以页面之后就会被自动释放掉

7.app的优化

首先考虑的就是性能优化和内存泄露的避免,关于性能优化可以举一个tableView的例子,在tableView中或许会出现加载图片的情况,如果加载图片的方法是在主线程中执行,很显然会阻塞主线程UI,形成卡的现象,这时候当然就得开辟线程去处理,但即便是多线程,如果下载的线程数量多了依然会卡UI,这里可以进行一些处理,比如在滚动减速的时候才进行图片加载,或者在减速停止的时候才加载,这样可以大大减少加载的数量。

关于内存泄露的话,在OC中关于内存的处理有一个原则,谁使用,谁释放,就是谁开辟了内存来使用,谁就要进行内存的释放,现在iOS开发有了ARC模式之后,这一步操作就被简化了,现在由系统来自动进行内存的释放,但是ARC也不是全能的,有时候在代码处理上出了问题,ARC也无法解决,比如某个对象所持有的内存引用计数为2的话,ARC自动将其释放,其引用计数-1,这个时候该对象依旧持有内存,并没有完全释放,一般这种时候都是编写的错误所致,所以在进行系统内存开辟的时候依旧要注意着些

8.KVC和KVO的应用场景

KVC即Key Value Coding,简单说就是访问某个属性的值,这样可以简化我们的代码量,KVO(Key Value Observer)同样可以访问属性,并且监听属性变化,与KVC最本质的区别就在于通过KVO监听的属性是一层层的,即可以监听该类的父类的父类等等

9.消息机制

即值的传递,在OC中,传值的方法比较常用的有5种:通知、单例、协议、属性、block。不同的时候用不同的方式会有更好的效果。通知比较抽象一些,它适用于同时对多个对象发送消息的情况;单例运用在某个类开辟的内存只有一个的情况下;协议,因为OC不支持多重继承,但可以通过协议的方式满足需要,所有遵循该协议的类都可以使用里面的方法;属性比较简单,多数运用在A页面跳转到B页面的情况中;block是一项新技术,可以将需要的值存进block代码块中,在需要的地方将之取出,使用block的时候需要注意内存循环引用的问题

10.堆和栈的区别

简单说就是堆存放一些简单赋值的变量,在不需要的时候由程序员手动释放;栈存放对象,在不使用的时候有编译器自动释放

11.屏幕适配

由于iPhone的屏幕大小不一,所以在开发过程中需要考虑程序在不同的手机上的显示效果,即UI。在进行UI适配的时候,有两种方式,一种是拖控件的方式,一种是代码编写的方式,两种方式都可以实现屏幕适配的效果,看个人喜好

12.项目中遇到的问题以及怎么解决

印象比较深刻的项目就是趣闻段子,在开发过程中遇到的问题比较多,但解决的也容易,比较难的就是关于tableView的重用机制,在重用机制上卡了挺长时间,后来通过大量的百度以及询问身边的同学,了解了其机制原理之后才从根本上解决了问题

13.事件机制

触发事件,在程序中有许多的事件,触控事件(手势)、传感器事件(设备重力感应等)、远程控制事件(远程遥控设备多媒体播放等)

一般开发过程中主要用到的是手势触控事件,这里可以通过系统提供的触控方式,也可以自定义手势。

14.沙盒的目录结构

在iOS中,每一个程序都有自己的一个沙盒路径,所有的数据缓存以及调用都只能在这个路径中(Douments、app、Library、Tmp),沙盒路径在每一个程序的路径在重新开启时都会进行更变,但是iOS系统的支持并不会使数据丢失

你可能感兴趣的:(ios,面试题)