首页
AI Coding
NEW
沸点
课程
直播
活动
AI刷题
APP
插件
搜索历史
清空
创作者中心
写文章
发沸点
写笔记
写代码
草稿箱
创作灵感
查看更多
会员
登录
注册
iOS底层原理
低调的默认名
创建于2021-07-21
订阅专栏
探索iOS的底层原理
等 24 人订阅
共25篇文章
创建于2021-07-21
订阅专栏
默认顺序
默认顺序
最早发布
最新发布
iOS底层学习 - 内存管理之Autoreleasepool
通过之前章节的学习,我们知道在ARC下,LLVM编译器会自动帮我们生产retain、release和autorelease等代码,减少了在MRC下的工作量。调用autorelease会将该对象添加进自动释放池中,它会在一个恰当的时刻自动给对象调用release,所以autore…
iOS底层学习 - 内存管理之内存管理方案
移动端的内存管理技术,主要有 GC(Garbage Collection,垃圾回收)的标记清除算法和苹果公司使用的引用计数方法。 相比较于 GC 标记清除算法,引用计数法可以及时地回收引用计数为 0 的对象,减少查找次数。但是,引用计数会带来循环引用的问题,比如当外部的变量强引…
iOS底层学习 - 深入RunLoop
一般来讲,一个线程一次只能执行一个任务,执行完成后线程就会退出。如果我们需要一个机制,让线程能随时处理事件但并不退出,这种模型通常被称作 Event Loop。 Event Loop 在很多系统和框架里都有实现,比如 Node.js 的事件处理,比如 Windows 程序的消息…
iOS底层学习 - Block全解
Block 是 Objective-C 对于闭包的实现。 简单来说,block就是将一些代码封装起来,以便在将来某个时候被使用,如果你不去调用block,block内部封装的代码就不会执行。 接下来查看__main_block_impl_0函数的定义,我们发现其内部其实就是进行…
iOS底层学习 - 多线程之中的锁🔐
锁 -- 是保证线程安全常见的同步工具。锁是一种非强制的机制,每一个线程在访问数据或者资源前,要先获取(Acquire) 锁,并在访问结束之后释放(Release)锁。如果锁已经被占用,其它试图获取锁的线程会等待,直到锁重新可用。 前面说到了,锁是用来保护线程安全的工具。 可以…
iOS底层学习 - 多线程之GCD底层原理篇
对于GCD的底层来说,主要有队列创建,函数执行,同步异步原理和其他应用函数的原理。关于队列原理的,我们之前的篇章已经讲过,相信对于GCD是如何创建队列的,已经有了认识,今天就来继续看其他的底层原理,还是通过源码来深入研究 我们都知道,当使用dispatch_sync在串行队列上…
iOS底层学习 - 多线程之GCD应用篇
我们知道GCD除了基本的dispatch_sync和dispatch_async用法外,还有一些其他的用法,比如信号量,调度组,延时执行等等。我们来看一下这个使用是怎么应用到我们平常的多线程开发当中的。 下面我们来分析一下,我们发现在主队列中有while任务NSLog任务,所以…
iOS底层学习 - 多线程之GCD队列原理篇
要像知道是底层是如何创建的,最好的方法还是阅读源码,万幸的是,多线程的代码,苹果是开源的,可以点击libdispatch源码下载。 在底层源码中,我们可以看到dispatch_queue_create的底层实现如下,可以看到调用了一个中间代码方法。下面我们深入_dispatch…
iOS底层学习 - 多线程之GCD初探
GCD全程为Grand Central Dispatch,由C语言实现,是苹果为多核的并行运算提出的解决方案,CGD会自动利用更多的CPU内核,自动管理线程的生命周期,程序员只需要告诉GCD需要执行的任务,无需编写任何管理线程的代码。GCD也是iOS使用频率最高的多线程技术。 …
iOS底层学习 - 多线程之基础原理篇
当一个程序进入内存运行时,即变成一个进程。进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位。每个进程之间是独立的,每个进程均运行在其专用的且受保护的内存。 在iOS开发中,一个App在内存中就是一个进程,且相互独立,只能访问自己的沙…
iOS底层学习 - KVO探索之路
KVO:(Key-Value-Observer)是一种机制,也叫观察者模式,该机制允许将其他对象的特定属性的更改通知给对象。对于应用程序中模型层和控制器层之间的通信特别有用 KVO的在平时的开发过程中,使用也比较多。基本就是3个步骤: context: 上下文,主要是传递给代理…
iOS底层学习 - KVC探索之路
KVC全称是Key-Value Coding,键值编码,可以通过Key来访问和修改属性。 我们可以通过查看Apple的官方文档来查看其定义和具体的用法。 基本的用法分为两种:赋值和取值。主要API如下 层级使用也比较容易理解,主要使用了setValue:forKeyPath:的…
iOS底层学习 - Runtime之砖厂面试答疑
答:是由C 和C++ 汇编 实现的⼀套API,为OC语⾔加⼊了⾯向对象,运⾏时的功能。平时编写的OC代码,在程序运⾏过程中,其实最终会转换成Runtime的C语⾔代 码,Runtime 是 Objective-C 的幕后⼯作者。 比如:将数据类型的确定由编译时推迟到了运⾏时,比…
iOS底层学习 - Runtime之Method Swizzling黑魔法
Method Swizzling(方法交换),顾名思义,就是将两个方法的实现交换,即由原来的A-AImp、B-BImp对应关系变成了A-BImp、B-AImp。 每个类都维护一个方法Method列表,Method则包含SEL和其对应IMP的信息,方法交换做的事情就是把SEL和I…
iOS底层学习 - 内存管理之weak原理探究
我们通过例子🌰来看一下__strong、__weak、__unsafe_unretained的区别在哪里. 先来看一下用__strong修饰的结果。可以发现修饰的对象在作用域结束之后并没有销毁,说明该对象的引用计数增加了 再来看一下__weak修饰的结果。通过下面的运行我们可…
iOS底层学习 - 从编译到启动的奇幻旅程(三)
根据字面意思我们可以得出,这个方法是读取影响运行时的环境变量,可以使用 export OBJC_HELP=1 来打印环境变量,从而进行一些调试,可以再Xcode中进行设置,从而达到想要的效果打印。相关可以参考OBJC_HELP OBJC_PRINT_LOAD_METHODS这个…
iOS底层学习 - 从编译到启动的奇幻旅程(二)
首先安利一本书《程序员的自我修养--链接、装载与库》,看完神清气爽。 可执行文件(程序)是一个静态的概念,在运行之前它只是硬盘上的一个文件;而进程是一个动态的概念,它是程序运行时的一个过程,我们知道每个程序被运行起来后,它会拥有自己独立的虚拟地址空间,这个地址空间大小的上限是由…
iOS底层学习 - 从编译到启动的奇幻旅程(一)
总体来说,一个APP从编写完代码到运行,就经历了两大步骤,即编译和运行,这一章节,主要来看一下APP的进行编译的。 iOS的代码,是通过编译器将代码直接编写成机器码,然后直接在CPU上运行机器码的,这样能使得我们的app和手机都能效率更高,运行更快。C,C++,OC等语言,都是…
iOS底层学习 - Runtime之方法消息的前世今生(二)
动态解析主要方法为_class_resolveMethod,源码如下,主要是对元类的判断。因为类方法是储存在元类之中的,处理方式略有不同 我们通过查看源码,发现在获取到IMP之后,系统会调用log_and_fill_cache,说明系统会对缓存的方法加日志,我们可以通过系统的日…
iOS底层学习 - Runtime之方法消息的前世今生(一)
对于一些调用频率太高的函数或操作,使用汇编来实现能够提高效率和性能,容易被机器来识别。
下一页