分享网易有道 iOS二面面试题

UIView 和 UIControl 的关系与区别

  • UIView侧重于页面布局,因addTarget:action:forControlEvents是在UIControl中定义的,它的父类UIView中没有,所以没有事件交互的方法,可以通过手势UITapGestureRecognizer来实现

  • UIControl侧重于事件交互,最大的特点是拥有addTarget:action:forControlEvents方法

  • UIControl继承自UIView

Command+B和Command+R 这中间发生了什么

  • 深入浅出iOS编译
  • 把一种编程语言(原始语言)转换为另一种编程语言(目标语言)的程序叫做编译器。
  • 大多数编译器由两部分组成:前端和后端
  • 前端负责词法分析,语法分析,生成中间代码
  • 后端以中间代码作为输入,进行行架构无关的代码优化,接着针对不同架构生成不同的机器码
  • 前后端依赖统一格式的中间代码(IR),使得前后端可以独立的变化。新增一门语言只需要修改前端,而新增一个CPU架构只需要修改后端即可。
image
  • 编译过程
    • 预处理 (预处理会替进行头文件引入,宏替换,注释处理,条件编译(#ifdef)等操作)
    • 词法分析 (将输入的代码转换为一系列符合特定语言的词法单元,这些词法单元类型包括了关键字,操作符,变量等等 告诉计算机这是什么意思)
    • 语法分析 (词法分析的Token流会被解析成一颗抽象语法树,有了抽象语法树,clang就可以对这个树进行分析,找出代码中的错误。比如类型不匹配,亦或Objective C中向target发送了一个未实现的消息)
    • CodeGen (CodeGen遍历语法树,生成LLVM IR代码。LLVM IR是前端的输出,后端的输入,Objective C代码在这一步会进行runtime的桥接)
    • 生成汇编代码 (LLVM对LR进行优化后,会针对不同架构生成不同的目标代码,最后以汇编代码的格式输出,看人下菜碟,什么架构 arm64 就给 arm64 架构的代码)
    • 汇编器 (汇编器以汇编代码作为输入,将汇编代码转换为机器代码,最后输出目标文件(object file) main.c 转main.o)
    • 链接link (连接器把编译产生的.o文件和(dylib,a,tbd)文件,生成一个mach-o可执行文件)
  • 运行过程
    • dyld动态链接器 装载 Mach-O 文件,递归链接所有的动态库,静态库.a也是 dyld 加载到内存中去的
    • rebase/binding (可执行文件和动态链接库在虚拟内存中的加载地址每次启动都不固定,所以需要这2步来修复镜像中的资源指针,来指向正确的地址。 rebase修复的是指向当前镜像内部的资源指针; 而bind指向的是镜像外部的资源指针。)
    • runtime 阶段 调用 map_Image解析处理可执行文件 注册 objc 类,初始化类对象,调用类和分类的+load 方法,调用 C++静态初始化起和attribute修饰的函数
    • AppDelegate类中的didFinishLaunchingWithOptions:

字典的具体实现

  • NSDictionary(字典)是使用 hash表来实现key和value之间的映射和存储的, hash函数设计的好坏影响着数据的查找访问效率。数据在hash表中分布的越均匀,其访问效率越高。而在Objective-C中,通常都是利用NSString 来作为键值,其内部使用的hash函数也是通过使用 NSString对象作为键值来保证数据的各个节点在hash表中均匀分布。
  • key 通过 哈希函数得到哈希值
  • 哈希值取余或者某种算法数组扩充阈值得到索引
  • 根据索引存储 value
  • 哈希冲突是开放定址法 重新把扩充阈值+1或者-1 再次哈希得到索引 或者直接索引+1
image

block 和函数指针的区别

  • 相似点

    • 1.函数指针和Block都可以实现回调的操作,声明上也很相似,实现上都可以看成是一个代码片段。

    • 2.函数指针类型和Block类型都可以作为变量和函数参数的类型。(typedef定义别名之后,这个别名就是一个类型)

  • 不同点

    • 1.函数指针只能指向预先定义好的函数代码块(可以是其他文件里面定义,通过函数参数动态传入的),函数地址是在编译链接时就已经确定好的。

    • 2.Block本质是Objective-C对象,是NSObject的子类,可以接收消息。

    • 3.函数里面只能访问全局变量,而Block代码块不光能访问全局变量,还拥有当前栈内存和堆内存变量的可读性(当然通过__block访问指示符修饰的局部变量还可以在block代码块里面进行修改)。

    • 4.从内存的角度看,函数指针只不过是指向代码区的一段可执行代码,而block实际上是程序运行过程中在栈内存动态创建的对象,可以向其发送copy消息将block对象拷贝到堆内存,以延长其生命周期。 关于第2点可以作一个实验,在定义block之后打一个断点,Cmd+R运行后,可以在调试窗口看到,block确实是一个对象,拥有isa指针。 另外,采用block写法,gcc编译出来可执行文件体积更大,这应该还是跟block是对象有关。

为自己的面试,为自己的跳槽,加油吧 iOS开发

简历模板+最新iOS题目+提升视频:docs.qq.com/doc/DVWlQam9Qd3B1cEF2

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容