招聘高峰期来了,你们都很是积极地准备着跳槽,那么去一家公司面试就会有一堆新鲜的问题,可能不会,也可能会,可是了解不够深。本篇文章为群里的小伙伴们去宝库公司的笔试题,由笔者整理并提供笔者我的参考答案。注意,仅供参考,不表明绝对正确。html
参考答案不惟一,你们能够根据本身的理解回答,没有必要跟笔者的同样。参考笔者的答案,也许给你带来灵感!ios
例如:web
1
2
3
|
NSArray *array = @[@"12-11", @"12-11", @"12-11", @"12-12", @"12-13", @"12-14"];
|
参考答案:面试
1
2
3
4
5
6
7
8
9
10
11
12
|
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
3
4
|
array = [array valueForKeyPath:@"@distinctUnionOfObjects.self"];
NSLog(@"%@", array);
|
可是返回的结果是无序的,与原来的顺序不一样。你们能够阅读:Collection Operators数据库
1
2
3
4
5
6
7
8
|
NSMutableDictionary *resultDict = [[NSMutableDictionary alloc] initWithCapacity:array.count];
for (NSString *item in array) {
[resultDict setObject:item forKey:item];
}
NSArray *resultArray = resultDict.allValues;
NSLog(@"%@", resultArray);
|
若是须要按照原来的升序排序,能够这样:swift
1
2
3
4
5
6
7
8
|
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
4
5
|
NSSet *set = [NSSet setWithArray:array];
NSArray *resultArray = [set allObjects];
NSLog(@"%@", resultArray);
|
若是要求有序,那就得排序,好比这里要升序排序:数组
1
2
3
4
5
6
7
8
|
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
4
|
NSOrderedSet *set = [NSOrderedSet orderedSetWithArray:array];
NSLog(@"%@", set.array);
|
以上三种方法是笔者所能想到的办法。若是你们有更好的办法,欢迎在评论中指出。
1
2
3
|
NSArray、NSSet、NSDictionary与NSMutableArray、NSMutableSet、NSMutableDictionary
|
参考答案:
特性:
做用:
参考答案:
笔者倾向于纯代码开发,因此所提供的参考答案可能具备必定的我的感情,不过仍是给你们说说笔者的想法。
优势:
缺点:
2015-04-10格式化日期转为NSDate类型
参考答案:
1
2
3
4
5
6
7
8
9
|
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);
|
参考答案:
在iOS中,一般是一般UIWebView来实现,固然在iOS8之后可使用WKWebView来实现.有如下几种实现方法:
1
2
3
|
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;
|
优缺点:
参考答案:
首先,咱们要明确一点,同步和异步都是在线程中使用的。在iOS开发中,好比网络请求数据时,若使用同步请求,则只有请求成功或者请求失败获得响应返回后,才能继续往下走,也就是才能访问其它资源(会阻塞了线程)。网络请求数据异步请求时,不会阻塞线程,在调用请求后,能够继续往下执行,而不用等请求有结果才能继续。
区别:
参考答案:
在iOS中队列分为如下几种:
1
2
3
|
dispatch_queue_t q = dispatch_queue_create("...", DISPATCH_QUEUE_SERIAL);
|
1
2
3
|
dispatch_queue_t q = dispatch_queue_create("......", DISPATCH_QUEUE_CONCURRENT);
|
1
2
3
|
dispatch_queue_t q = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
|
1
2
3
|
dispatch_queue_t q = dispatch_get_main_queue();
|
上面这四种是针对GCD来说的,串行队列中的任务只能一个个地执行,在前一个没有执行完毕以前,下一个只能等待。并行队列能够并发地执行任务,所以多个任务之间执行的顺序不能肯定,当添加一个新的任务时,交由GCD来判断是否要建立新的新的线程。
你们能够阅读图片多线程,也许更明了:
参考答案:
内存管理准则:谁强引用过,谁就在再也不使用时使引用计数减一。
对于内存的使用和优化常见的有如下方面:
参考答案:
plist是iOS系统中特有的文件格式。咱们经常使用的NSUserDefaults偏好设置实质上就是plist文件操做。plist文件是用来持久化存储数据的。
咱们一般使用它来存储偏好设置,以及那些少许的、数组结构比较复杂的不适合存储数据库的数据。好比,咱们要存储全国城市名称和id,那么咱们要优先选择plist直接持久化存储,由于更简单。
参考答案:
详情请阅读:iOS经常使用的持久化存储方式
参考答案:
数据库的简单操做,仍是会的,大学可没白学。
增:
1
2
3
|
insert into tb_blogs(name, url) values('标哥的技术博客','http://www.henishuo.com');
|
删:
1
2
3
|
delete from tb_blogs where blogid = 1;
|
改:
1
2
3
|
update tb_blogs set url = 'www.henishuo.com' where blogid = 1;
|
查:
1
2
3
|
select name, url from tb_blogs where blogid = 1;
|
十二、在提交苹果审核时,遇到哪些问题被拒绝,对于被拒绝的问题是如何处理的。
参考答案:
对于笔者而言,所提交过的app尚未被拒绝过。不过在笔者所维护的几个群里常常有朋友们问到相关被拒绝的解决办法。幸亏还懂一点点英文,还能帮助他们翻译翻译苹果反馈的被拒缘由及所担的建议。
这里只列出几种最多见的被拒缘由:
在这个夜晚,全部答案都是笔者花了大量的时间来整理出来的,且看且珍惜吧!