iOS之2016面试题一

序言

招聘高峰期来了,你们都很是积极地准备着跳槽,那么去一家公司面试就会有一堆新鲜的问题,可能不会,也可能会,可是了解不够深。本篇文章为群里的小伙伴们去宝库公司的笔试题,由笔者整理并提供笔者我的参考答案。注意,仅供参考,不表明绝对正确。html

参考答案不惟一,你们能够根据本身的理解回答,没有必要跟笔者的同样。参考笔者的答案,也许给你带来灵感!ios

一、对数组中的元素去重复

例如:web

参考答案:面试

  • 第一种方法:开辟新的内存空间,而后判断是否存在,若不存在则添加到数组中,获得最终结果的顺序不发生变化。效率分析:时间复杂度为O ( n2 ):

 

补充:原来集合操做能够经过valueForKeyPath来实现的,去重能够一行代码实现:算法

可是返回的结果是无序的,与原来的顺序不一样。你们能够阅读:Collection Operators数据库

  • 第二种方法:利用NSDictionary去重,字典在设置key-value时,若已存在则更新值,若不存在则插入值,而后获取allValues。若不要求有序,则能够采用此种方法。若要求有序,还得进行排序。效率分析:只须要一个循环就能够完成放入字典,若不要求有序,时间复杂度为O(n)。若要求排序,则效率与排序算法有关:

 

若是须要按照原来的升序排序,能够这样:swift

 

  • 第三种方法:利用集合NSSet的特性(肯定性、无序性、互异性),放入集合就自动去重了。可是它与字典拥有一样的无序性,所得结果顺序再也不与原来同样。若是不要求有序,使用此方法与字典的效率应该是差很少的。效率分析:时间复杂度为O (n):

 

若是要求有序,那就得排序,好比这里要升序排序:数组

补充:缓存

一直没有使用过有序集合,网友们反馈到能够直接使用有序集合,感谢你们:服务器

以上三种方法是笔者所能想到的办法。若是你们有更好的办法,欢迎在评论中指出。

二、说说如下元素的特性和做用

 

参考答案:

特性:

  • NSArray表示不可变数组,是有序元素集,只能存储对象类型,可经过索引直接访问元素,并且元素类型能够不同,可是不能进行增、删、改操做;NSMutableArray是可变数组,能进行增、删、改操做。经过索引查询值很快,可是插入、删除等效率很低。
  • NSSet表示不可变集合,具备肯定性、互异性、无序性的特色,只能访问而不能修改集合;NSMutableSet表示可变集合,能够对集合进行增、删、改操做。集合经过值查询很快,插入、删除操做极快。
  • NSDictionary表示不可变字典,具备无序性的特色,每一个key对应的值是惟一的,可经过key直接获取值;NSMutableDictionary表示可变字典,能对字典进行增、删、改操做。经过key查询值、插入、删除值都很快。

做用:

  • 数组用于处理一组有序的数据集,好比经常使用的列表的dataSource要求有序,可经过索引直接访问,效率高。
  • 集合要求具备肯定性、互异性、无序性,在iOS开发中是比较少使用到的,笔者也不清楚如何说明其做用
  • 字典是键值对数据集,操做字典效率极高,时间复杂度为常量,可是值是无序的。在ios中,常见的JSON转字典,字典转模型就是其中一种应用。

三、简单描述一下XIB与Storyboards,说一下他们的优缺点。

参考答案:

笔者倾向于纯代码开发,因此所提供的参考答案可能具备必定的我的感情,不过仍是给你们说说笔者的想法。

优势:

  • XIB:在编译前就提供了可视化界面,能够直接拖控件,也能够直接给控件添加约束,更直观一些,并且类文件中就少了建立控件的代码,确实简化很多,一般每一个XIB对应一个类。
  • Storyboard:在编译前提供了可视化界面,可拖控件,可加约束,在开发时比较直观,并且一个storyboard能够有不少的界面,每一个界面对应一个类文件,经过storybard,能够直观地看出整个App的结构。

缺点:

  • XIB:需求变更时,须要修改XIB很大,有时候甚至须要从新添加约束,致使开发周期变长。XIB载入相比纯代码天然要慢一些。对于比较复杂逻辑控制不一样状态下显示不一样内容时,使用XIB是比较困难的。当多人团队或者多团队开发时,若是XIB文件被发动,极易致使冲突,并且解决冲突相对要困难不少。
  • Storyboard:需求变更时,须要修改storyboard上对应的界面的约束,与XIB同样可能要从新添加约束,或者添加约束会形成大量的冲突,尤为是多团队开发。对于复杂逻辑控制不一样显示内容时,比较困难。当多人团队或者多团队开发时,你们会同时修改一个storyboard,致使大量冲突,解决起来至关困难。

四、请把字符串2015-04-10格式化日期转为NSDate类型

参考答案:

 

五、在App中混合HTML5开发App如何实现的。在App中使用HTML5的优缺点是什么?

参考答案:

在iOS中,一般是一般UIWebView来实现,固然在iOS8之后可使用WKWebView来实现.有如下几种实现方法:

  • 经过实现UIWebView的代理方法来拦截,判断scheme是不是约定好的,而后iOS调用本地相关API来实现:

 

 

优缺点:

  • iOS加入H5响应比原生要慢不少,体验不太好,这是缺点。
  • iOS加入H5能够实现嵌入别的功能入口,可随时更改,不用更新版本就能够上线,这是最大的优势

六、请描述一下同步和异步,说说它们之间的区别。

参考答案:

首先,咱们要明确一点,同步和异步都是在线程中使用的。在iOS开发中,好比网络请求数据时,若使用同步请求,则只有请求成功或者请求失败获得响应返回后,才能继续往下走,也就是才能访问其它资源(会阻塞了线程)。网络请求数据异步请求时,不会阻塞线程,在调用请求后,能够继续往下执行,而不用等请求有结果才能继续。

区别:

  • 线程同步:是多个线程访问同一资源时,只有当前正在访问的线程访问结束以后,其余线程才能开始访问(被阻塞)。
  • 线程异步:是多个线程在访问竞争资源时,能够在空闲等待时去访问其它资源(不被阻塞)。

七、请简单描述一下队列和多线程的使用原理。

 

参考答案:

在iOS中队列分为如下几种:

  • 串行队列:队列中的任务只会顺序执行

 

 

  • 并行队列: 队列中的任务一般会并发执行

 

 

  • 全局队列:是系统的,直接拿过来(GET)用就能够;与并行队列相似

 

 

  • 主队列:每个应用程序对应惟一一个主队列,直接GET便可;在多线程开发中,使用主队列更新UI

 

上面这四种是针对GCD来说的,串行队列中的任务只能一个个地执行,在前一个没有执行完毕以前,下一个只能等待。并行队列能够并发地执行任务,所以多个任务之间执行的顺序不能肯定,当添加一个新的任务时,交由GCD来判断是否要建立新的新的线程。

你们能够阅读图片多线程,也许更明了:

八、描述一下iOS的内存管理,在开发中对于内存的使用和优化包含哪些方面。咱们在开发中应该注意哪些问题。

参考答案:

内存管理准则:谁强引用过,谁就在再也不使用时使引用计数减一。

对于内存的使用和优化常见的有如下方面:

  • 重用问题:如UITableViewCells、UICollectionViewCells、UITableViewHeaderFooterViews设置正确的reuseIdentifier,充分重用。
  • 尽可能把views设置为不透明:当opque为NO的时候,图层的半透明取决于图片和其自己合成的图层为结果,可提升性能。
  • 不要使用太复杂的XIB/Storyboard:载入时就会将XIB/storyboard须要的全部资源,包括图片所有载入内存,即便将来好久才会使用。那些相比纯代码写的延迟加载,性能及内存就差了不少。
  • 选择正确的数据结构:学会选择对业务场景最合适的数组结构是写出高效代码的基础。好比,数组: 有序的一组值。使用索引来查询很快,使用值查询很慢,插入/删除很慢。字典: 存储键值对,用键来查找比较快。集合: 无序的一组值,用值来查找很快,插入/删除很快。
  • gzip/zip压缩:当从服务端下载相关附件时,能够经过gzip/zip压缩后再下载,使得内存更小,下载速度也更快。
  • 延迟加载:对于不该该使用的数据,使用延迟加载方式。对于不须要立刻显示的视图,使用延迟加载方式。好比,网络请求失败时显示的提示界面,可能一直都不会使用到,所以应该使用延迟加载。
  • 数据缓存:对于cell的行高要缓存起来,使得reload数据时,效率也极高。而对于那些网络数据,不须要每次都请求的,应该缓存起来,能够写入数据库,也能够经过plist文件存储。
  • 处理内存警告:通常在基类统一处理内存警告,将相关不用资源当即释放掉
  • 重用大开销对象:一些objects的初始化很慢,好比NSDateFormatter和NSCalendar,但又不可避免地须要使用它们。一般是做为属性存储起来,防止反复建立。
  • 避免反复处理数据:许多应用须要从服务器加载功能所需的常为JSON或者XML格式的数据。在服务器端和客户端使用相同的数据结构很重要。
  • 使用Autorelease Pool:在某些循环建立临时变量处理数据时,自动释放池以保证能及时释放内存。
  • 正确选择图片加载方式:详情阅读细读UIImage加载方式

九、plist文件是用来作什么的。通常用它来处理一些什么方面的问题。

参考答案:

plist是iOS系统中特有的文件格式。咱们经常使用的NSUserDefaults偏好设置实质上就是plist文件操做。plist文件是用来持久化存储数据的。

咱们一般使用它来存储偏好设置,以及那些少许的、数组结构比较复杂的不适合存储数据库的数据。好比,咱们要存储全国城市名称和id,那么咱们要优先选择plist直接持久化存储,由于更简单。

十、iOS中缓存必定量的数据以便下次能够快速执行,那么数据会存储在什么地方,有多少种存储方式?

参考答案:

  • 偏好设置(NSUserDefaults)
  • plist文件存储
  • 归档
  • SQLite3
  • Core Data

详情请阅读:iOS经常使用的持久化存储方式

十一、请简单写出增、删、改、查的SQL语句。

参考答案:

数据库的简单操做,仍是会的,大学可没白学。

增:

删:

改:

查:

十二、在提交苹果审核时,遇到哪些问题被拒绝,对于被拒绝的问题是如何处理的。

参考答案:

对于笔者而言,所提交过的app尚未被拒绝过。不过在笔者所维护的几个群里常常有朋友们问到相关被拒绝的解决办法。幸亏还懂一点点英文,还能帮助他们翻译翻译苹果反馈的被拒缘由及所担的建议。

这里只列出几种最多见的被拒缘由:

  • 最多见到的就是app中有虚拟物品交易,可是不是走内购致使被拒。
  • 音频类App或者使用到音频相关的app,由于版权问题而被拒
  • App出现必闪退而被拒

最后

在这个夜晚,全部答案都是笔者花了大量的时间来整理出来的,且看且珍惜吧!

相关文章
相关标签/搜索