Swift 社区最近的重大新闻 ABI 稳定了。
2019 年 Swift 5.0 带来 ABI 稳定。 下面整理一些关于 ABI 稳定的一些问题。
什么是 ABI?ABI 是 Application Binary Interface 的缩写,它是一个规范,通过这个规范,所有独立编译的二进制实体可以被链接在一起并执行。
什么是 ABI 稳定?ABI 稳定就是二进制接口稳定,就是在运行的时候只要用 Swift 5 或以上的编译器编译出来的 binary, 就可以跑在任意的 Swift 5 或以上的 Runtime 上。 因此,在以后就不用向 App 中放 Swift runtime, 这都将被集成在 iOS/macOS 系统里。
对 App 的影响 ?
App 尺寸会变小。 由于系统中预装了 Swift runtime,不需要额外打包到 APP 包中,会使应用包的尺寸变小。 尺寸变小是相对iOS 12.2或以上预装 Swift runtime 系统来说的,对于 iOS 12.2 以下的系统不会改变。
程序在新系统上会更省内存。系统集成了 Swift 由于共用一套 runtime,所以应用 ...
什么是 RunLoop ?Run loop 表示一个循环程序会一直运行。通过内部维护事件循环(Event Loop)来对事件/消息进行管理的一个对象。事件循环模型的特点: 在没有消息处理时,线程进入休眠状态以避免资源占用,在有消息时,立刻被唤醒执行任务。
所以,RunLoop 实际上就是一个对象,这个对象管理了其需要处理的事件和消息,并提供了一个入口函数来执行上面 Event Loop 的逻辑。线程执行了这个函数后,就会一直处于这个函数内部 “接受消息->等待->处理” 的循环中,直到这个循环结束(比如传入 quit 的消息),函数返回。
在 iOS 系统中提供了两个这样的对象:
NSRunLoop : 基于 CFRunLoopRef 封装,提供面向对象的 API,但是不是线程安全的。
CFRunLoopRef :是在 CoreFoundation框架中,提供了纯 C 的API,是线程安全。
main函数为什么不会退出?应用程序中,启动后执行下面代码:
12345int main(int argc, char * argv[]) { @autor ...
基础部分基本术语SEL : 选择器,指方法的名字1typedef struct objc_selector *SEL;
IMP :指针,指向方法的具体实现地址1typedef void (*IMP)(void /* id, SEL, ... */ );
id :表示任意的OC类型1234/// 代表OC类typedef struct objc_class *Class;/// 执行类实例的指针typedef struct objc_object *id;
Class 是 objc_class 结构体类型的指针。 id 是 objc_object 结构体类型的指针。id 表示对象,Class 表示类。
isa : 指向实例所属的类1234struct objc_object { isa_t isa; //...};
实例的 isa 指向 class,当调用对象方法时,通过 isa 找到对应的类,找到对应的方法进行调用。如果没有通过 superclass 查找父类。
类的 isa 指向 meta-class,当调用类方法时,通过 isa 找到对 ...
前言从本篇文章开始,笔者会整理iOS逆向相关的笔记。作为一位新人,希望通过整理笔记能够更好的理解和掌握知识。能力有限,在行文时难免出现错误欢迎批评和指正。
前期准备:
一台越狱的iOS设备,笔者使用iPad mini2系统iOS9.2.1(推荐使用iOS9.1或者可以完美越狱的系统)
一台电脑,笔者使用的是MacBook Pro
一条数据线
如何越狱网上有很多教程帮助你来越狱,这里推荐两个网站:
PP助手
爱思助手
注意:在购买iOS设备时直接购买对应版本的系统,由于苹果官方关闭降级通道所以无法刷固件降级。
越狱成功后,桌面上会出现一个叫做Cydia的应用,它是越狱后的App Store可以安装各种第三方的软件,比如:插件、补丁、APP等。该应用的作者Jay Freeman(saurik),一位骨灰级大神。
必装插件或补丁
Apple File Conduit 2:可以访问整个iOS设备的文件系统。作者是Jay Freeman。
AppSync unified: 可以绕过系统验证,随意安装、运行破解的IPA安装包。
PP助手: 一个应用商店,可以自由安装海量APP。
O ...
更新:2019.3.26 RxSwift v4.4 Swift 4.2
前言上一篇 《iOS开发进阶-RxSwift之Observables》学习了Observables概念,如何创建,订阅以及清除等。Observables在运行时将值添加到序列中,在将来的某个时机发射给订阅者。Subjects与Observables不同在于它同时担任序列和订阅者两个角色。
Subjects本节将会学习不同类型的Subject,各个类型Subject是如何工作的及它们之间的不同点。
在RxSwift中,提供了四种不同类型的Subject 和两种解包类型。分别如下:
①、PublishSubject:初始化为空,只发射最新的元素给订阅者。
②、BehaviorSubject:有初始值,并且重复发射最晚一个元素给订阅者。
③、ReplaySubject:存在一个缓存区,重复发射符合缓存个数的元素给新的订阅者。
④、Variable:是BehaviorSubject的包装。
⑤、AsyncSubject: 只有在接收到 .completed事件时,发射最后一个 .next 事件。这个类型 Sub ...
参考:RxSwift-Reactive Programming with Swift (Swift4.0)
ObservablesObservables是Rx的核心,本节将花点时间学习如何创建和使用Observables。在RxSwift中,Observables、Observables sequence和sequence代表相同的意思,在RxSwift的世界里,任何事物都是序列。observable也是序列,它可以产生事件,事件可以包含值。
Observables三种状态和生命周期Observables有三种状态分别是next、error和completed 。下面使用圆珠图(marble diagram)理解Observables的生命周期。上图中从左到右的箭头代表时间,线上的圆珠代表序列事件元素。随着时间的推移线上的元素会被依次发射。observable发射元素产生next事件。
另一张圆珠图,它存在一个结束线。
此observable发射三个tap事件,当结束时会发个completed事件作为序列的结束标志。例如:tap所在的界面销毁。在observable结束后不 ...
在iOS多线程中,经常会出现资源竞争和死锁的问题。本节将学习iOS中不同的锁。
线程同步方案
常见的两个问题:多线程买票和存取钱问题。
示例:存取钱问题
12345678910111213141516171819202122232425262728293031// 示例:存取钱问题- (void)moneyTest { self.moneyCount = 100; dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ for (int i = 0; i < 5; i++) { [self saveMoney]; } }); dispatch_async(queue, ^{ for (int i = 0; i < 5; i++) { ...
iOS中多线程首先看一道面试题
iOS中多线程有哪些实现方案?
技术方案
简介
语言
线程声明周期
使用频率
pthread
1. 一套通用的多线程API2. 跨平台/可移植3. 使用难度大
C
程序员管理
几乎不用
NSThread
1.面向对象 2.简单易用直接操作线程对象
OC
程序员管理
偶尔使用
GCD
1.旨在替代NSThread等线程技术 2.充分利用设备的多核
C
自动管理
经常使用
NSOperation
1.基于GCD2.比GCD多了一些更实用的函数
OC
自动管理
经常使用
iOS中,多线程一般有三种方案GCD、NSOperation和NSThread。
这一篇文章,会学习iOS中关于多线程相关的问题,以及面试中的问题。
一、GCDGCD相关问题一般分为三个方面:首先,同步/异步和串行/并发问题;其次,dispatch_barrier_async异步栅栏调用,解决多读单写问题;最后,dispatch_group使用和理解。
GCD中有2中用来执行任务的函数:同步和异步;同时还有两种类型的队列:并发和串行队列。并发队列让 ...
问题描述当向远程仓库push代码时出现该错误。
1error: unpack failed: error Missing blob c7eb8a2bcbe57f7f134819fbe6e2975b04b2e548
出现该问题是因为本地索引出错导致的,解决方法很简单。
解决办法123* 第一步:切换到其他branch。例如:git checkout dev * 第二步:来取远程数据。命令:git pull origin dev* 第三步:切换到之前的branch再push。
Git理解Git的设计思想和基本的工作原理,对更好的使用Git至关重要。
Git思想直接记录快照,而非比较差异。和其他版本控制系统不同的是,Git存储数据时将数据看成小型的文件系统的一组快照,每次在修改文件提交更新后,它主要对当时的所有文件制作一个快照并保存到快照索引中。Git还对这一个保存过程进行了优化,也就是说当文件没有本修改时,Git不会重新存储文件而是只保留一个链接指向之前存储的文件。这是Git与其他版本控制系统的重要区别。
近乎所有的操作都是在本地执行。Git的大多数操作都是在本地完成,当我们在没有网络或者没有VPN的情况下,同样可以使用Git进行办公。因为在本地磁盘上有项目的完整历史,可以在任何时候浏览项目的历史。
保证数据的完整性。Git为了保证数据的完整性在存储前都会计算校验和,通过校验和来引用。校验和机制叫做SHA-1散列,也叫哈希散列。Git通过对校验和的检查可以保证数据的完整性。
校验和是40个十六进制组成的字符串。例如
124b9da6552252987aa493b52f8696cd6d3b00373
在Git中,所以文件都是通过校验和进行查找的,而不是文 ...