美文网首页iOS 进阶开发
内卷吧! iOS开发君

内卷吧! iOS开发君

作者: Cooci_和谐学习_不急不躁 | 来源:发表于2021-09-03 20:58 被阅读0次

    前序

    前段时间因为课程需要 , 我出了一套iOS考试试卷 想着VIP大家做得非常不错. 带着分享的精神也开源了出来 一套iOS底层试卷-我想和你分享 结果反响巨大! 很多靓仔靓女纷纷私聊我....大致分为以下两种:

    • 1: Cooci 你这不是在加剧行业内卷???
    • 2: Cooci 你那套试卷真不错,有没有答案我好好学习一下

    根据上面两种反馈,我索性又打算开源一套考试,就让内卷来得更猛烈一点吧!!! 😁😁😁

    大师班第二次考试介绍

    正常考试 分为四种题型. 总分 200分 (不要问我为什么不是100分,诶...就是玩!!!!😸)

    • 1、选择题 (每题5分, 共7道 35分)

    • 2、判断题 (每题5分, 共6道 30分)

    • 3、简单题 (每题12分 共10道 120分)

    • 4、拓展满分题 (15分)

    考试范围: iOS底层常见面试题 - KVC - KVO - 多线程 - GCD - Block

    下面我就贴出题目吧,如果你有时间的,不妨也拿笔本子测试一下,看看能做多少分,在文章留言我会第一时间发你答案!


    一、选择题(每题5分)

    1. LGTeacher 继承于 LGPerson, 下面代码输出为什么 () 分值5分
    LGTeacher *t = [[LGTeacher alloc] init];
    
    - (instancetype)init{
        self = [super init];
        if (self) {
            NSLog(@"%@ - %@",[self class],[super class]);
        }
        return self;
    }
    
    • A: LGTeacher - LGTeacher

    • B: LGTeacher - LGPerson

    • C: LGTeacher - NSObject

    • D: LGTeacher - 它爱输出啥就输出啥,我不清楚

    1. 下面代码能否正常执行以及输出 () 分值5分
    @interface LGPerson : NSObject
    @property (nonatomic, retain) NSString *kc_name;
    - (void)saySomething;
    @end
    
    @implementation LGPerson
    - (void)saySomething{ 
        NSLog(@"%s - %@",__func__,self.kc_name);
    }
    @end
    
    
    - (void)viewDidLoad {
        [super viewDidLoad] ;
        
        Class cls = [LGPerson class];
        void  *kc = &cls;
        [(__bridge id)kc saySomething];
    }
    
    • A: 能 - ViewController

    • B: 能 - null

    • C: 能 - ViewController: 0x7ff8d240ad30

    • D: 能不能自己运行一下不就知道,非要问我 - 它爱输出啥就输出啥,我不清楚

    1. 下面代码执行,控制台输出结果是什么 () 分值5分
    NSObject *objc = [NSObject new];
    NSLog(@"%ld",CFGetRetainCount((__bridge CFTypeRef)(objc)));
    
    void(^block1)(void) = ^{
        NSLog(@"---%ld",CFGetRetainCount((__bridge CFTypeRef)(objc)));
    };
    block1();
    
    void(^__weak block2)(void) = ^{
        NSLog(@"---%ld",CFGetRetainCount((__bridge CFTypeRef)(objc)));
    };
    block2();
    
    void(^block3)(void) = [block2 copy];
    block3();
    
    __block NSObject *obj = [NSObject new];
    void(^block4)(void) = ^{
        NSLog(@"---%ld",CFGetRetainCount((__bridge CFTypeRef)(obj)));
    };
    block4();
    
    • A: 1 2 2 2 2

    • B: 1 2 3 3 2

    • C: 1 3 3 4 1

    • D: 1 3 4 5 1

    1. 下面代码执行,控制台输出结果是什么 () 分值5分
    - (void)MTDemo{
        while (self.num < 5) {
            dispatch_async(dispatch_get_global_queue(0, 0), ^{
                self.num++;
            });
        }
        NSLog(@"KC : %d",self.num);
    }
    
    - (void)KSDemo{
       
        for (int i= 0; i<10000; i++) {
            dispatch_async(dispatch_get_global_queue(0, 0), ^{
                self.num++;
            });
        }
        NSLog(@"Cooci : %d",self.num);
    }
    
    • A: 0 , 10000

    • B: 0 , <10000

    • C: <=5 , <10000

    • D: >=5 , <10000

    1. 下面代码执行,控制台输出结果是什么 () 分值5分
    - (void)textDemo2{
        dispatch_queue_t queue = dispatch_queue_create("cooci", DISPATCH_QUEUE_CONCURRENT);
        NSLog(@"1");
        dispatch_async(queue, ^{
            NSLog(@"2");
            dispatch_sync(queue, ^{
                NSLog(@"3");
            });
            NSLog(@"4");
        });
        NSLog(@"5");
    }
    
    - (void)textDemo1{
        
        dispatch_queue_t queue = dispatch_queue_create("cooci", NULL);
        NSLog(@"1");
        dispatch_async(queue, ^{
            NSLog(@"2");
            dispatch_sync(queue, ^{
                NSLog(@"3");
            });
            NSLog(@"4");
        });
        NSLog(@"5");
    }
    
    • A: 1 5 2 3 4 , 1 5 2

    • B: 1 5 2 4 3 , 死锁奔溃

    • C: 1 5 2 3 4 , 死锁奔溃

    • D: 1 5 2 3 , 死锁奔溃

    1. 下面代码执行,控制台输出结果是什么 () 分值5分
    @property (nonatomic, strong) NSMutableArray      *mArray;
    
    - (NSMutableArray *)mArray{
        if (!_mArray) _mArray = [NSMutableArray arrayWithCapacity:1];
        return _mArray;
    }
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"1",@"2", nil];
        self.mArray = arr;
    
        void (^kcBlock)(void) = ^{
            [arr addObject:@"3"];
            [self.mArray addObject:@"a"];
            NSLog(@"KC %@",arr);
            NSLog(@"Cooci: %@",self.mArray);
        };
        [arr addObject:@"4"];
        [self.mArray addObject:@"5"];
        
        arr = nil;
        self.mArray = nil;
        
        kcBlock();
    }
    
    • A: 1 2 4 5 3 , nil

    • B: 1 2 4 5 3 , a

    • C: 1 2 4 5 3 , 1 2 4 5 3 a

    • D: 1 2 4 5 3 a , 1 2 4 5 3 a

    二、判断题 (每题5分)

    1. 可变数组线程是安全 () 分值5分
    1. 主队列搭配同步函数就会产生死锁 () 分值5分
    1. 下面代码执行不会报错 () 分值5分
    int a = 0;
    void(^ __weak weakBlock)(void) = ^{
        NSLog(@"-----%d", a);
    };
    
    struct _LGBlock *blc = (__bridge struct _LGBlock *)weakBlock;
    id __strong strongBlock = [weakBlock copy];
    blc->invoke = nil;
    void(^strongBlock1)(void) = strongBlock;
    strongBlock1();
    
    1. 下面代码执行不会报错 () 分值5分
    NSObject *a = [NSObject alloc];
    void(^__weak block1)(void) = nil;
    {
        void(^block2)(void) = ^{
            NSLog(@"---%@", a);
        };
        block1 = block2;
        NSLog(@"1 - %@ - %@",block1,block2);
    }
    block1();
    
    1. 下面代码会产生循环引用 () 分值5分
    __weak typeof(self) weakSelf = self;
    self.doWork = ^{
        __strong typeof(self) strongSelf = weakSelf;
        weakSelf.doStudent = ^{
            NSLog(@"%@", strongSelf);
        };
       weakSelf.doStudent();
    };
    self.doWork();
    
    1. 下面代码是否有问题 () 分值5分
    - (void)demo3{
        dispatch_queue_t concurrentQueue = dispatch_get_global_queue(0, 0);
        
        for (int i = 0; i<5000; i++) {
            dispatch_async(concurrentQueue, ^{
                NSString *imageName = [NSString stringWithFormat:@"%d.jpg", (i % 10)];
                NSURL *url = [[NSBundle mainBundle] URLForResource:imageName withExtension:nil];
                NSData *data = [NSData dataWithContentsOfURL:url];
                UIImage *image = [UIImage imageWithData:data];
                
                dispatch_barrier_async(concurrentQueue, ^{
                    [self.mArray addObject:image];
                });
    
            });
        }
    }
    
    
    1. 下面代码不会产生循环引用 () 分值5分
    static ViewController *staticSelf_;
    
    - (void)blockWeak_static {
        __weak typeof(self) weakSelf = self;
        staticSelf_ = weakSelf;
    }
    

    三、简单题 (每题 10分 合计 120分)

    请把它当成一场面试,认真对待 希望大家耐心 切忌浮躁 (和谐学习 不急不躁)

    • 1、请用GCD实现读写锁 , 解释为什么这么设计 分值10分

    • 2、@synchronized 为什么应用频次最多 分值10分

    • 3、block 的种类有几种 是符合区分的? 分值10分

    • 4、KVC 普通对象 setter 过程 分值10分

    • 5、KVO 底层原理机制分析 分值10分

    • 6、下面代码的栈帧入栈情况是什么的? 分值10分

    - (void)viewDidLoad { 
        [super viewDidLoad] ; 
        
        
        Class cls = [LGPersonP class];
        void  *kc = &cls;
        [(__bridge id)kc saySomething]; 
        
        LGPersonP *person = [LGPersonP alloc];
    }
    
    • 7、iOS 线程如何保活, 为什么要线程保活 分值10分

    • 8、循环引用,为什么要在block中加strong,不加会怎样 分值10分

    • 9、你使用过 dispatch_once 吗?了解底层吗?让你实现一个应该怎么操作? 分值10分

    • 10、iOS 多线程原理和线程生命周期是什么样的 分值10分

    • 11、请简述信号量和调度组的原理 分值10分

    • 12、请简述 __block 修饰变量被 block 捕获之后的情况 分值10分

    四、拓展满分题 (15分)

    1. 作为一名iOS中高级开发人员, 你的加分项和优势是什么?

    PS: 说明

    恭喜大家能够完成,这个题目稍微有一点难度,但是如果你能够快速完成,并且达到 150 左右! 我相信你接下来的iOS发展应该不会太难 (没有 150 也能发展很好)

    当然也会有很多靓仔会存在一些问题,需要试卷答案的靓仔,评论留言 以PDF形式发你! 加油,靓仔靓女.....

    相关文章

      网友评论

        本文标题:内卷吧! iOS开发君

        本文链接:https://www.haomeiwen.com/subject/rotlwltx.html