iOS开发高手课
戴铭
前滴滴出行技术专家
立即订阅
11464 人已学习
课程目录
已完结 46 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 锚定一个点,然后在这个点上深耕
免费
基础篇 (20讲)
01 | 建立你自己的iOS开发知识体系
02 | App 启动速度怎么做优化与监控?
03 | Auto Layout 是怎么进行自动布局的,性能如何?
04 | 项目大了人员多了,架构怎么设计更合理?
05 | 链接器:符号是怎么绑定到地址上的?
06 | App 如何通过注入动态库的方式实现极速编译调试?
07 | Clang、Infer 和 OCLint ,我们应该使用谁来做静态分析?
08 | 如何利用 Clang 为 App 提质?
09 | 无侵入的埋点方案如何实现?
10 | 包大小:如何从资源和代码层面实现全方位瘦身?
11 | 热点问题答疑(一):基础模块问题答疑
12 | iOS 崩溃千奇百怪,如何全面监控?
13 | 如何利用 RunLoop 原理去监控卡顿?
14 | 临近 OOM,如何获取详细内存分配信息,分析内存问题?
15 | 日志监控:怎样获取 App 中的全量日志?
16 | 性能监控:衡量 App 质量的那把尺
17 | 远超你想象的多线程的那些坑
18 | 怎么减少 App 电量消耗?
19 | 热点问题答疑(二):基础模块问题答疑
20 | iOS开发的最佳学习路径是什么?
应用开发篇 (12讲)
21 | 除了 Cocoa,iOS还可以用哪些 GUI 框架开发?
22 | 细说 iOS 响应式框架变迁,哪些思想可以为我所用?
23 | 如何构造酷炫的物理效果和过场动画效果?
24 | A/B 测试:验证决策效果的利器
25 | 怎样构建底层的发布和订阅事件总线?
26 | 如何提高 JSON 解析的性能?
27 | 如何用 Flexbox 思路开发?跟自动布局比,Flexbox 好在哪?
28 | 怎么应对各种富文本表现需求?
29 | 如何在 iOS 中进行面向测试驱动开发和面向行为驱动开发?
30 | 如何制定一套适合自己团队的 iOS 编码规范?
31 | iOS 开发学习资料和书单推荐
32 | 热点问题答疑(三)
原理篇 (6讲)
33 | iOS 系统内核 XNU:App 如何加载?
34 | iOS 黑魔法 Runtime Method Swizzling 背后的原理
35 | libffi:动态调用和定义 C 函数
36 | iOS 是怎么管理内存的?
37 | 如何编写 Clang 插件?
38 | 热点问题答疑(四)
原生与前端共舞 (5讲)
39 | 打通前端与原生的桥梁:JavaScriptCore 能干哪些事情?
40 | React Native、Flutter 等,这些跨端方案怎么选?
41 | 原生布局转到前端布局,开发思路有哪些转变?
42 | iOS原生、大前端和Flutter分别是怎么渲染的?
43 | 剖析使 App 具有动态化和热更新能力的方案
用户故事 (1讲)
用户故事 | 我是如何学习这个专栏的?
结束语 (1讲)
结束语 | 慢几步,深几度
iOS开发高手课
登录|注册

11 | 热点问题答疑(一):基础模块问题答疑

戴铭 2019-04-04
你好,我是戴铭。
专栏上线以来,我通过评论区收到了很多同学提出的问题、建议、心得和经验,当然提的问题居多。虽然我未在评论区对每条留言做出回复,但是我对大家提出的问题却都一一记录了下来,等待这次答疑文章的到来。其实,不光是在留言区,也有一些朋友通过私信跟我反馈了学习专栏遇到的问题。
所以,今天我就借此机会,汇总并整理了几个典型并重要的问题,和你详细说一说,希望可以解答你在学习前面 10 篇文章时的一些困惑。

动态库加载方式的相关问题

@五子棋在看完第 5 篇文章“链接器:符号是怎么绑定到地址上的?”后,关于动态库是否参与链接的问题,通过私信和我反馈了他的观点。他指出:动态库也是要参与链接的,不然就没法知道函数的标记在哪儿。
为了帮助大家理解这个问题,我把与这个问题相关的内容,再和你展开一下。
我在文章中,是这么阐述这部分内容的:
Mach-O 文件是编译后的产物,而动态库在运行时才会被链接,并没参与 Mach-O 文件的编译和链接,所以 Mach-O 文件中并没有包含动态库里的符号定义。也就是说,这些符号会显示为“未定义”,但它们的名字和对应的库的路径会被记录下来。运行时通过 dlopen 和 dlsym 导入动态库时,先根据记录的库路径找到对应的库,再通过记录的名字符号找到绑定的地址。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《iOS开发高手课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(19)

  • Mad Mark
    关于Mike Ash的那篇objc_msgSend文章,我写过一篇译文 http://madmark.cc/2017/08/01/ARM64_objc-msgSend/

    作者回复: 赞

    2019-04-04
    7
  • 绝影
    可以分享多一些您关注的博客或博主吗?

    作者回复: 在后面学习资料推荐篇里我会统一整理好推荐给大家哈

    2019-04-04
    7
  • 时间都去哪了
    请问一个新项目在这个时间点用OC还是swift呢?能说说两者应该如何选择呢?

    作者回复: 新项目用 Swift。不用犹豫

    2019-04-07
    3
  • melody
    想问下您平时都利用什么途径去获取一些优质苹果的官方文档和博客内容呢?

    作者回复: 官方文档直接就在官网搜索。发现好的博客文章会订阅博主的博客了,通过 RSS 阅读器看。

    2019-04-10
    2
  • 贰叁
    垠神是coder的三大浪漫之一编译原理世界顶级的大神
    2019-04-20
    1
  • 陈阿票
    将代码编写成动态库,可不可以减少启动时间?
    2019-04-10
    1
  • Geek_e1d503
    老师您好,我想问下并发量大、日活量大的app该注意哪些啊,它的架构和性能上该注意哪些?有没有相关资料可以推荐看下的?
    2019-04-04
    1
  • IAMCJ
    “一种是,在程序开始运行时通过 dyld 动态加载。通过 dyld 加载的动态库需要在编译时进行链接,链接时会做标记,绑定的地址在加载后再决定”

    所以大部分动态库是会在编译的时候链接是吗?这个时候的“链接”是并没有绑定地址吗?那这个“链接”主要做了什么内容呢?

    作者回复: 做标记

    2019-07-23
    1
  • 安达
    老师,我想问下 vm_read_overwrite 获取到的是不是函数返回的虚拟地址,我在研究打印栈和符号解析代码,很困惑的是各种 Slide 偏移,一会儿加一会儿减,对于整个流程,获取函数返回地址->找到 Image -> 找到 Segment -> 找到符号表 -> 找到符号,这其中是不是根本不需要知道函数在物理内存真实的地址,从头到尾就用的虚拟地址?
    2019-05-28
  • 沧海行舟
    看完第二篇就在动手写hook objc_msg_send的代码,这是学习汇编中记录的一些arm64汇编知识https://github.com/wzpziyi1/Arm64-
    有需要的童鞋可以看看。
    在学习过程中,发现一个问题(或者说我以为的bug)。
    在戴老师的代码中,hook objc_msgSend之前保存个寄存器的状态时,并未保存向量寄存器的状态:
    "stp q6, q7, [sp, #-32]!\n" \
    "stp q4, q5, [sp, #-32]!\n" \
    "stp q2, q3, [sp, #-32]!\n" \
    "stp q0, q1, [sp, #-32]!\n" \
    "stp x8, x9, [sp, #-16]!\n" \
    "stp x6, x7, [sp, #-16]!\n" \
    "stp x4, x5, [sp, #-16]!\n" \
    "stp x2, x3, [sp, #-16]!\n" \
    "stp x0, x1, [sp, #-16]!\n" \

    只是保存了通用寄存器x0--x9寄存器的值,在调试代码时,发现这样的c代码:
    struct TestOne {
        double a;
        double b;
        double number;
        double type;
    }TestOne;

    void test(struct TestOne x) {
        x.a = 10;
        x.b = 20;
        x.number = 2;
        x.type = 11;
    }

    void call() {
        struct TestOne x = {0,0,0,0};
        test(x);
    }

    转成arm64汇编时,结构体的值是保存在向量寄存器d0--d4中的:
    _test: ; @test
    fmov d4, #11.00000000
    fmov d5, #2.00000000
    fmov d6, #20.00000000
    fmov d7, #10.00000000
    str d0, [sp]
    str d1, [sp, #8]
    str d2, [sp, #16]
    str d3, [sp, #24]
    str d7, [sp]
    str d6, [sp, #8]
    str d5, [sp, #16]
    str d4, [sp, #24]
    add sp, sp, #32 ; =32
    ret


    _call: ; @call
    sub sp, sp, #48 ; =48
    stp x29, x30, [sp, #32] ; 8-byte Folded Spill
    add x29, sp, #32 ; =32
    mov x8, #0
    str x8, [sp, #24]
    str x8, [sp, #16]
    str x8, [sp, #8]
    str x8, [sp]
    ldr d3, [sp, #24]
    ldr d2, [sp, #16]
    ldr d1, [sp, #8]
    ldr d0, [sp]
    bl _test
    ldp x29, x30, [sp, #32] ; 8-byte Folded Reload
    add sp, sp, #48 ; =48
    ret

    如果在项目中,有开发童鞋直接这么写:
    - (void)doSomething:(struct TestOne)test;
    那么hook objc_msgSend时没保存的向量寄存器的状态,会出现问题的吧?
    2019-04-16
  • 雍鹏亮
    我现在在基于clang开发,目标是是让oc支持Annotation注解功能,但是开源的clang版本要低于Xcode中默认的clang两个版本,而且Xcode10还使用New Build System,有些编译参数也不兼容,蛋疼…
    2019-04-09
  • 贰零壹玖
    提出这些问题的有个比较大的原因是计算机编程的基础问题没打好,或者不是科班出身且没有系统学习过的。
    2019-04-05
  • Xcode
    谢谢戴老师奉上精彩的课程,太需要这种原创,深度广度并存的干货,正在学习中
    2019-04-05
  • 可以分享多一些您的学习方法么?以及能否分享下您关注的一些大神的博客,github大神么?非常感谢
    2019-04-04
  • addSubview工程师
    能介绍下iOS设计架构嘛MVVM啥的最近面试被问的多了
    2019-04-04
  • FR
    建议多发一些相关的资料链接
    2019-04-04
  • HeminWon
    戴铭老师👊🏼北国之恋我正好全部看完

    作者回复: 赞

    2019-04-04
  • 张蒙
    学习了,谢谢
    2019-04-04
  • 元元
    扫了一眼我大脑告诉我危险我就点了back
    2019-04-04
收起评论
19
返回
顶部