快手面试题

分享之前的快手iOS面试题,供大家参考。

1、写出aView和bView的frame和bounds。

- (void)viewDidLoad {
    UIView *aView = [[UIView alloc] init];
    UIView *bView = [[UIView alloc] init];
    [self.view addSubview:aView];
    [aView addSubview:bView];
    aView.layer.anchorPoint = CGPointMake(0,0);
    aView.frame = CGRectMake(100,100,100,100);
    aView.transform = CGAffineTransformMakeScale(2, 2);
    bView.frame = CGRectMake(0,0,50,50);
}

2、使用递归,计算从1加到100的值

3、+(void)load和+(void)initialize有什么区别?如果在category里面写了这两个函数有什么效果?

4、请设计一个递归搜索指定目录下指定类型文件的函数,要求写清返回值、函数名、参数列表。

*****************只写函数名、不用实现函数内容*******************

5、设计一个网络请求API,无需实现

6、谈谈基础组件的设计,自己写过哪些基础组件?

7、启动框架设计

A -> B,A模块依赖B模块

B -> C,B模块依赖C模块

C -> D,C模块依赖D模块

D -> A,D模块依赖A模块

注意考虑优先级、依赖关系,启动等待、组件启动失败等情况。


8、简述应用现有架构,以及如何改进?

简述自己app的应用架构,同时会根据架构情况进行追问。


9、信号量应用,写一个使用信号量的场景

//创建信号量,参数:信号量的初值,如果小于0则会返回NULLdispatch_semaphore_create(信号量值)

//等待降低信号量dispatch_semaphore_wait(信号量,等待时间)

//提高信号量dispatch_semaphore_signal(信号量)


10、简述编译原理,编译过程、语义检测和语法检查

基本的编译过程分为四个步骤:预处理(Pre-process):把宏替换,删除注释,展开头文件,产生 .i 文件。编译(Compliling):把之前的 .i 文件转换成汇编语言,产生 .s文件。汇编(Asembly):把汇编语言文件转换为机器码文件,产生 .o 文件。链接(Link):对.o文件中的对于其他的库的引用的地方进行引用,生成最后的可执行文件(同时也包括多个 .o 文件进行 link)。

编译器的组成:前端和后端

  • 前端负责词法分析,语法分析,生成中间代码;
  • 后端以中间代码作为输入,进行行架构无关的代码优化,接着针对不同架构生成不同的机器码;

Objective C/C/C++使用的编译器前端是clang,后端都是LLVM


11、cocoapod 执行install后发生了什么?

要了解cocoapods的下载原理、集成原理、版本控制原理。

cocoapods的下载原理:

s.source = { :git => ‘git@gitlab.xxx.net:ios-thirdpartservice/xxxreact.git’, :tag => ‘1.0.0’ }当使用Cocoapods导入私有库时,Cocoapods先是根据:git => ‘git@gitlab.xxx.net:ios-thirdpartservice/xxxreact.git’找到对应的git仓库,然后根据:tag => ‘1.0.0’定位到对应tag的提交(如果没有注明Pod依赖库版本则定位到最后一次的提交),然后在这次提交中检索后缀为.podspec的文件(文件可以随便命名)。找到podspec文件后先要验证s.name是否与Podfile中的一致,如果不一致则install时会报错:[!]Unable to find a specification for ‘React’.验证成功后,就会根据Podspec中的s.source_files找到需要导入的代码文件,并通过其他的的数据找到对应的配置文件或资源文件等。最后,将其下载到本地项目中。如果是共有库,这些原理也相同。只是共有库要将podspec文件上传到cocoapods。在导入的时候通过名字React去cocoapods匹配对应的podspec,然后根据s.source去找到对应的仓库和对应的版本,然后会再去匹配新的podspec,后边的步骤就完全相同了。

集成原理:

当所有的依赖库都下载完后,Cocoapods会将所有的依赖库都放到另一个名为Pods的项目中,然后让主项目依赖Pods项目。这样,源码管理工作都从主目录移到了Pods项目中。Pods项目最终会编译成为一个名为libPods.a的文件,主项目只要依赖这个.a文件即可。对于资源文件,Cocoapods提供了一个名为Pods-resource.sh的bash脚本,该脚本在每次项目编译的时候都会执行,将Pods依赖库的各种资源文件复制到目标目录中。Cocoapods还通过一个名为Pods.xcconfig的文件来在编译时设置所有的依赖和参数。libPods.aPods-resources.shPods.xcconfig

版本控制原理:

当执行完pod install之后,cocoapods会生成一个podfile.lock的文件。podfile.lock文件最大的用处在于多人开发。如果你没有在podfile中指定pods版本pod ‘React’,那么默认为获取当前React依赖库的最新版本。当团队中的某个人执行完pod install命令后,生产的podfile.lock文件就记录下了当时最新pods依赖库的版本,这时团队中的其他人check下来这份包含podfile.lock文件的工程以后,再去执行pod install命令时,获取下来的pods依赖库的版本和最开始用户获取到的版本一致。如果没有podfile.lock文件,后续所有用户执行pod install命令都会获取最新版本的React,这就可能造成一个团队使用的依赖库版本不一致,这对团队协作来说绝对是个灾难。在这种情况下,如果团队想使用当前最新版本的React依赖库,有两种方案:1、更改podfile,使其指向最新版本的React依赖库 2、执行pod update命令;鉴于podfile.lock文件对团队协作如此重要,所以应该加入到版本控制里面。


尊重原创内容,转载请注明出处
本文链接地址: https://www.awnlab.com/archives/595

为您推荐

发表评论

邮箱地址不会被公开。 必填项已用*标注