2020年iOS大厂面试题总结(一)
文章目录
2020年IOS面试题总结(一)
1. ios内存管理机制
2. NSThread、GCD、NSOperation多线程
3.输入一个字符串,判断这个字符串是否是有效的IP地址
4.大数加法怎么实现?
5.简述KVC和KVO,其中KVO实现原理?
6.Block实现原理;堆上和栈上的数据如何同步?
7.iOS设计模式
8.多线程有哪些?如何保证多线程中读写分离,加锁方案?
9.如何删除单链表中一个元素?
10.NSNotificationCenter通知中心的实现原理?
11.推送如何实现的?
12.SEL的使用和原理?
13.点击事件如何穿透透明的View?
14.RunLoop的实现原理?(答案待完善)
15.简述Runtime,发送消息的过程;
16.简述weak的实现原理;
17.写一个单例;
18.如何从字符串中得到一个整数?
19.数组去重方式;
20.设计一个数据库;(答案待完善)
21.实现多个网络请求ABC执行完再执行D
22.列表页性能优化
23.HTTPS(答案待完善)
23.音视频相关
1. ios内存管理机制
iOS内存管理机制的原理是引用计数,当这块内存被创建后,它的引用计数0->1,表示有一个对象或指针持有这块内存,拥有这块内存的所有权,如果这时候有另外一个对象或指针指向这块内存,那么为了表示这个后来的对象或指针对这块内存的所有权,引用计数1->2,之后若有一个对象或指针不再指向这块内存时,引用计数-1,表示这个对象或指针不再拥有这块内存的所有权,当一块内存的引用计数变为0,表示没有任何对象或指针持有这块内存,系统便会立刻释放掉这块内存。
alloc、new :类初始化方法,开辟新的内存空间,引用计数+1;
retain :实例方法,不会开辟新的内存空间,引用计数+1;
copy : 实例方法,把一个对象复制到新的内存空间,新的内存空间引用计数+1,旧的不会;其中分为浅拷贝和深拷贝,浅拷贝只是拷贝地址,不会开辟新的内存空间;深拷贝是拷贝内容,会开辟新的内存空间;
strong :强引用; 引用计数+1;
release :实例方法,释放对象;引用计数-1;
autorelease : 延迟释放;autoreleasepool自动释放池;当执行完之后引用计数-1;
还有是initWithFormat和stringWithFormat 字符串长度大于9时,引用计数+1;
assign : 弱引用 ;weak也是弱引用,两者区别:assign不但能作用于对象还能作用于基本数据类型,但是所指向的对象销毁时不会将当前指向对象的指针指向nil,有野指针的生成;weak只能作用于对象,不能作用于基本数据类型,所指向的对象销毁时会将当前指向对象的指针指向nil,防止野指针的生成。
2. NSThread、GCD、NSOperation多线程
1、NSThread
NSThread是封装程度最小最轻量级的,使用更灵活,但要手动管理线程的生命周期、线程同步和线程加锁等,开销较大;
[NSThread isMultiThreaded];//BOOL 是否开启了多线程
[NSThread currentThread];//NSThread 获取当前线程
[NSThread mainThread];//NSThread 获取主线程
[NSThread sleepForTimeInterval:1];//线程睡眠1s
2、GCD
GCD基于C语言封装的,遵循FIFO
1dispatch_sync与dispatch_async//同步和异步操作
2
3dispatch_queue_t;//主要有串行和并发两种;
4 其中:
5 dispatch_queue_create("concurrent_queue", DISPATCH_QUEUE_CONCURRENT)并发;
6 dispatch_queue_create("serial_queue", DISPATCH_QUEUE_SERIAL)串行;
7
8dispatch_once_t;//代码只会被执行一次,用于单例
9dispatch_after;//延迟操作
10dispatch_get_main_queue;//回到主线程操作
11
12
13//Demo单例
14+ (instancetype)sharedInstance {
15 static ZZScreenshotsMonitor *instance = nil;
16 static dispatch_once_t onceToken;
17 dispatch_once(&onceToken, ^{
18 instance = [[self alloc] init];
19 });
20 return instance;
21}
22
23
24
25//Demo:执行顺序
26- (void)viewDidLoad {
27 [super viewDidLoad];
28 dispatch_async(dispatch_get_main_queue(), ^{
29 NSLog(@"1");
30 });
31
32 NSLog(@"2");33
34 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND,0);
35
36 dispatch_sync(queue, ^{
37 NSLog(@"3");
38 });
39
40 dispatch_async(dispatch_get_main_queue(), ^{
41
NSLog(@"4");
42 });
43
44 dispatch_async(queue, ^{
45 NSLog(@"5");
46 });
47
48 NSLog(@"6");
49
50 [self performSelector:@selector(delayMethod) withObject:nil afterDelay:0];
51
52 NSLog(@"8");
53}
54
55- (void)delayMethod {
56
57}
58
59打印结果:23658147;其中5和8随机调换
60
61
NSOperation
NSOperation基于GCD封装的,比GCD可控性更强;可以加入操作依赖(addDependency)、设置操作队列最大可并发执行的操作个数(setMaxConcurrentOperationCount)、取消操作(cancel)等,需要使用两个它的实体子类:NSBlockOperation和NSInvocationOperation,或者继承NSOperation自定义子类;NSBlockOperation和NSInvocationOperation用法的主要区别是:前者执行指定的方法,后者执行代码块,相对来说后者更加灵活易用。NSOperation操作配置完成后便可调用start函数在当前线程执行,如果要异步执行避免阻塞当前线程则可以加入NSOperationQueue中异步执行
作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的点击加入群聊iOS交流群:789143298 进群密码123,不管你是小白还是大牛欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术,
大家一起交流学习成长!

3.输入一个字符串,判断这个字符串是否是有效的IP地址
1+ (BOOL)isValidIP:(NSString *)ipStr {
2 if (nil == ipStr) {
3 return NO;
4 }
5
6 NSArray *ipArray = [ipStr componentsSeparatedByString:@"."];
7 if (ipArray.count == 4) {
8 for (NSString *ipnumberStr in ipArray) {
9 if ([self isPureInt:ipnumberStr]) {
10 int ipnumber = [ipnumberStr intValue];
11 if (!(ipnumber>=0 && ipnumber<=255)) {
12 return NO;
13 }
14 }
15 }
16 return YES;
17 }
18 return NO;
19}
20//是否整形
21- (BOOL)isPureInt:(NSString*)string {
22 NSScanner* scan = [NSScanner scannerWithString:string];
23 int val;
24 return[scan scanInt:&val] && [scan isAtEnd];
25}
26//是否只含有数字
27- (BOOL)validateNumber:(NSString*)number {
28 BOOL res = YES;
29 NSCharacterSet* tmpSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];
30 int i = 0;
31 while (i < number.length) {
32 NSString * string = [number substringWithRange:NSMakeRange(i, 1)];
33 NSRange range = [string rangeOfCharacterFromSet:tmpSet];
34 if (range.length == 0) {
35 res = NO;
36 break;
37 }
38 i++;
39 }
40 return res;
41
42}
43
44
4.大数加法怎么实现?
使用字符串实现;
1/两个大数相加算法
2-(NSString *)addTwoNumberWithOneNumStr:(NSString *)one anotherNumStr:(NSString *)another
3{
4 int i = 0;
5 int j = 0;
6 int maxLength = 0;
7 int sum = 0;
8 int overflow = 0;
9 int carryBit = 0;
10 NSString *temp1 = @"";
11 NSString *temp2 = @"";
12 NSString *sums = @"";
13 NSString *tempSum = @"";
14 int length1 = (int)one.length;
15 int length2 = (int)another.length;
16 //1.反转字符串
17 for (i = length1 - 1; i >= 0 ; i--) {
18 NSRange range = NSMakeRange(i, 1);
19 temp1 = [temp1 stringByAppendingString:[one substringWithRange:range]];
20 NSLog(@"%@",temp1);
21 }
22 for (j = length2 - 1; j >= 0; j--) {
23 NSRange range = NSMakeRange(j, 1);
24 temp2 = [temp2 stringByAppendingString:[another substringWithRange:range]];
25 NSLog(@"%@",temp2);
26 }
27
28 //2.补全缺少位数为0
29 maxLength = length1 > length2 ? length1 : length2;
30 if (maxLength == length1) {
31 for (i = length2; i < length1; i++) {
32 temp2 = [temp2 stringByAppendingString:@"0"];
33 NSLog(@"i = %d --%@",i,temp2);
34 }
35 }else{
36 for (j = length1; j < length2; j++) {
37 temp1 = [temp1 stringByAppendingString:@"0"];
38 NSLog(@"j = %d --%@",j,temp1);
39 }
40 }
41 //3.取数做加法
42 for
