序言
招聘高峰期来了,大家都非常积极地准备着跳槽,那么去一家公司面试就会有一堆新鲜的问题,可能不会,也可能会,但是了解不够深。本篇文章为群里的小伙伴们去宝库公司的笔试题,由笔者整理并提供笔者个人参考答案。注意,仅供参考,不代表绝对正确。
参考答案不唯一,大家可以根据自己的理解回答,没有必要跟笔者的一样。参考笔者的答案,也许给你带来灵感!
1、对数组中的元素去重复
例如:
1 | NSArray *array = @[@ "12-11" , @ "12-11" , @ "12-11" , @ "12-12" , @ "12-13" , @ "12-14" ]; |
参考答案:
1 2 3 4 5 6 7 8 9 10 | NSMutableArray *resultArray = [[NSMutableArray alloc] initWithCapacity:array.count]; // 外层一个循环 for (NSString *item in array) { // 调用-containsObject:本质也是要循环去判断,因此本质上是双层遍历 // 时间复杂度为O ( n^2 )而不是O (n) if (![resultArray containsObject:item]) { [resultArray addObject:item]; } } NSLog(@ "resultArray: %@" , resultArray); |
补充:原来集合操作可以通过valueForKeyPath来实现的,去重可以一行代码实现:
1 2 | array = [array valueForKeyPath:@ "@distinctUnionOfObjects.self" ]; NSLog(@ "%@" , array); |
但是返回的结果是无序的,与原来的顺序不同。大家可以阅读:Collection Operators
1 2 3 4 5 6 | NSMutableDictionary *resultDict = [[NSMutableDictionary alloc] initWithCapacity:array.count]; for (NSString *item in array) { [resultDict setObject:item forKey:item]; } NSArray *resultArray = resultDict.allValues; NSLog(@ "%@" , resultArray); |
如果需要按照原来的升序排序,可以这样:
1 2 3 4 5 6 | resultArray = [resultArray sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) { NSString *item1 = obj1; NSString *item2 = obj2; return [item1 compare:item2 options:NSLiteralSearch]; }]; NSLog(@ "%@" , resultArray); |
1 2 3 | NSSet *set = [NSSet setWithArray:array]; NSArray *resultArray = [set allObjects]; NSLog(@ "%@" , resultArray); |
如果要求有序,那就得排序,比如这里要升序排序:
1 2 3 4 5 6 | resultArray = [resultArray sortedArrayUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) { NSString *item1 = obj1; NSString *item2 = obj2; return [item1 compare:item2 options:NSLiteralSearch]; }]; NSLog(@ "%@" , resultArray); |
补充:
一直没有使用过有序集合,网友们反馈到可以直接使用有序集合,感谢大家:
1 2 | NSOrderedSet *set = [NSOrderedSet orderedSetWithArray:array]; NSLog(@ "%@" , set.array); |
以上三种方法是笔者所能想到的办法。如果大家有更好的办法,欢迎在评论中指出。
2、说说以下元素的特性和作用
1 | NSArray、NSSet、NSDictionary与NSMutableArray、NSMutableSet、NSMutableDictionary |
参考答案:
特性:
作用:
3、简单描述一下XIB与Storyboards,说一下他们的优缺点。
参考答案:笔者倾向于纯代码开发,所以所提供的参考答案可能具有一定的个人感情,不过还是给大家说说笔者的想法。
优点:
缺点:
4、请把字符串2015-04-10格式化日期转为NSDate类型
参考答案:
1 2 3 4 5 6 7 | NSString *timeStr = @ "2015-04-10" ; NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; formatter.dateFormat = @ "yyyy-MM-dd" ; formatter.timeZone = [NSTimeZone defaultTimeZone]; NSDate *date = [formatter dateFromString:timeStr]; // 2015-04-09 16:00:00 +0000 NSLog(@ "%@" , date); |
5、在App中混合HTML5开发App如何实现的。在App中使用HTML5的优缺点是什么?
参考答案:
在iOS中,通常是通常UIWebView来实现,当然在iOS8以后可以使用WKWebView来实现.有以下几种实现方法:
通过实现UIWebView的代理方法来拦截,判断scheme是否是约定好的,然后iOS调用本地相关API来实现:
1 | - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType; |
在iOS7以后,可以直接通过JavaScripteCore这个库来实现,通过往JS DOM注入对象,而这个对象对应于我们iOS的某个类的实例。更详细请阅读:
可以通过WebViewJavascriptBridge来实现。具体如何使用,请大家去其它博客搜索吧!
优缺点:
6、请描述一下同步和异步,说说它们之间的区别。
参考答案:
首先,我们要明确一点,同步和异步都是在线程中使用的。在iOS开发中,比如网络请求数据时,若使用同步请求,则只有请求成功或者请求失败得到响应返回后,才能继续往下走,也就是才能访问其它资源(会阻塞了线程)。网络请求数据异步请求时,不会阻塞线程,在调用请求后,可以继续往下执行,而不用等请求有结果才能继续。
区别:
7、请简单描述一下队列和多线程的使用原理。
参考答案:
在iOS中队列分为以下几种:
1 | dispatch_queue_t q = dispatch_queue_create( "..." , DISPATCH_QUEUE_SERIAL); |
1 | dispatch_queue_t q = dispatch_queue_create( "......" , DISPATCH_QUEUE_CONCURRENT); |
1 | dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); |
1 | dispatch_queue_t q = dispatch_get_main_queue(); |
上面这四种是针对GCD来讲的,串行队列中的任务只能一个个地执行,在前一个没有执行完毕之前,下一个只能等待。并行队列可以并发地执行任务,因此多个任务之间执行的顺序不能确定,当添加一个新的任务时,交由GCD来判断是否要创建新的新的线程。
大家可以阅读图片多线程,也许更明了:iOS图解多线程
8、描述一下iOS的内存管理,在开发中对于内存的使用和优化包含哪些方面。我们在开发中应该注意哪些问题。
参考答案:
内存管理准则:谁强引用过,谁就在不再使用时使引用计数减一。
对于内存的使用和优化常见的有以下方面:
9、plist文件是用来做什么的。一般用它来处理一些什么方面的问题。
参考答案:
plist是iOS系统中特有的文件格式。我们常用的NSUserDefaults偏好设置实质上就是plist文件操作。plist文件是用来持久化存储数据的。
我们通常使用它来存储偏好设置,以及那些少量的、数组结构比较复杂的不适合存储数据库的数据。比如,我们要存储全国城市名称和id,那么我们要优先选择plist直接持久化存储,因为更简单。
10、iOS中缓存一定量的数据以便下次可以快速执行,那么数据会存储在什么地方,有多少种存储方式?
参考答案:
详情请阅读:iOS常用的持久化存储方式
11、请简单写出增、删、改、查的SQL语句。
参考答案:
数据库的简单操作,还是会的,大学可没白学。
1 |
1 | delete from tb_blogs where blogid = 1; |
1 | update tb_blogs set url = 'www.henishuo.com' where blogid = 1; |
1 | select name, url from tb_blogs where blogid = 1; |
12、在提交苹果审核时,遇到哪些问题被拒绝,对于被拒绝的问题是如何处理的。
参考答案:
对于笔者而言,所提交过的app还没有被拒绝过。不过在笔者所维护的几个群里经常有朋友们问到相关被拒绝的解决办法。幸好还懂一点点英文,还能帮助他们翻译翻译苹果反馈的被拒原因及所担的建议。
这里只列出几种最常见的被拒原因:
最后
在这个夜晚,所有答案都是笔者花了大量的时间来整理出来的,且看且珍惜吧!如果所提供的参考答案与您的想法有所不同,欢迎到群里来交流,也可以直接在评论中反馈。