![](https://img-blog.csdnimg.cn/7e376995cc89411aa83e3f23ae981b1f.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
iOS
文章平均质量分 84
iOS是由苹果公司开发的移动操作系统,苹果公司最早于2007年1月9日的Macworld大会上公布这个系统,最初是设计给iPhone使用的,后来陆续套用到iPod touch、iPad上。iOS与苹果的macOS操作系统一样,属于类Unix的商业操作系统。原本这个系统名为iPhone OS
风雨「83」
木秀于林,风必崔之。出外言行,慎之慎之!
展开
-
swiftUI和swift的区别
SwiftUI是苹果公司推出的一种用于构建iOS、macOS、watchOS和tvOS应用程序界面的框架。它是基于Swift编程语言开发的,旨在简化UI开发过程并提供实时预览功能,使开发人员可以更快地构建出漂亮的应用程序界面。Swift是苹果公司推出的一种面向对象的编程语言,旨在取代Objective-C成为iOS、macOS、watchOS和tvOS平台的主要编程语言。它具有现代编程语言的特性,如类型推断、闭包、泛型和安全的空值处理等,并在性能和安全性方面进行了优化。原创 2023-07-06 09:14:34 · 3013 阅读 · 0 评论 -
iphone测试中除了appium,还有更好用的工具吗
Robot Framework支持多种脚本语言,包括Python、Java、.NET等,可以进行模拟用户交互、数据驱动测试、跨平台测试等。SeeTest支持多种脚本语言,包括JavaScript、Python、Ruby等,可以进行模拟用户交互、数据驱动测试、跨平台测试等。TestComplete Mobile支持多种脚本语言,包括JavaScript、Python、VBScript等,可以进行模拟用户交互、数据驱动测试、跨平台测试等。KIF还提供了一些方便的断言和验证工具,可以提高测试效率和可靠性。原创 2023-06-16 09:31:06 · 1564 阅读 · 0 评论 -
Run Loops
但是,因为主线程启动了自己的运行循环,所以只要应用程序调用应用程序委托的applicationDidFinishLaunching:方法,您就可以开始对该线程发出调用。虽然您可以只带一个附加的计时器进入运行循环,但一旦计时器触发,它通常会失效,这将导致运行循环退出。运行循环模式是要监视的输入源和计时器的集合,以及要通知的运行循环观察器的集合。在运行循环的传递过程中,只有与该模式关联的源被监视并允许传递它们的事件。这样做时,您可以使用想要运行嵌套运行循环的任何模式,包括外部运行循环使用的模式。原创 2023-04-12 18:06:46 · 591 阅读 · 0 评论 -
iOS 内存管理机制与原理
sidetables可以理解为一个全局的hash数组,里面存储了sidetables类型的数据,其中长度为8或者64一个obj(oc对象)对应了一个sideTable,但是一个SideTable,会对应多个obj,因为sidetabels的数量只有8或者64个,所以有很多obj会共用一个sidetable在弱引用表中,key是对象的地址,value是weak指针地址的数组(weak_entry_t)原创 2023-04-07 09:01:14 · 1388 阅读 · 0 评论 -
LLVM编译流程
LLVM是构架编译器(compliter)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的便是时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。LLVM计划启动于2000年,最初由美国UIUC大学的chris Lattner博士主持开展。2006年Chris Lattner加盟Apple inc。并致力于LLVM在Apple开发体系中的应用。原创 2023-03-29 16:36:54 · 730 阅读 · 0 评论 -
iOS Swift之RxSwift初探
Podfile文件target中添加一下代码并pod update 、、或者手动下载拖出代码模块。例如,先通过用户名密码取得 Token 然后通过 Token 取得用户信息,你不需要去管理观察者的生命周期,这样你就有更多精力去关注业务逻辑。回调也变得十分简单,错误和返回结果分离,逻辑更加清晰。例如,需要将两个网络请求合并成一个,通过Rx使得代码逻辑清晰可见。这样处理代码更加简洁。原创 2022-09-07 10:37:35 · 2584 阅读 · 0 评论 -
iOS RunLoop 原理和核心机制
RunLoop是维护其内部事件循环的一个对象,它在程序运行过程中重复的做着一些事情,例如接收消息、处理消息、休眠等等。所谓的事件循环,就是对事件/消息进行管理,没有消息时,休眠线程以避免资源消耗,从用户态切换到内核态。有事件/消息需要进行处理时,立即唤醒线程,回到用户态进行处理。...原创 2022-07-18 15:40:59 · 2045 阅读 · 0 评论 -
cocoaPods 添加成功后,导入不了头文件或者not found file 报错
cocoapods添加第三方库,并且cocoapods添加成功,但是却在任何一个文件上都导入不了头文件,而且根本没有提示,即使手动打#import "xxxx.h"也报错xxxx.h not found file , 那么 我们就在 TARGETS --> Build Settings —> User Header Search Paths 中 添加${SRCROOT} 就可以了, 若还有错 试着把上一步 ${SRCROOT} 中属性 no-recursive 改为recursive。...原创 2022-06-29 17:13:31 · 1521 阅读 · 0 评论 -
iOS 保持界面流畅的技巧
界面流畅度优化技巧包含卡顿检测以及原理预排版预编码解码按需加载异步渲染具体可参考学习大神的帖子iOS 保持界面流畅的技巧 | Garan no douhttps://blog.ibireme.com/2015/11/12/smooth_user_interfaces_for_ios/原创 2022-06-27 09:59:31 · 873 阅读 · 0 评论 -
iOS之卡顿检测
很多iOS 开发,开发过程中都会面临到解决App卡顿问题,从而也衍生出很多的方法去解决卡顿,这篇文章来描述下iOS卡顿产生的原因,以及如何进行iOS卡顿检测分析。像素是如何显示到屏幕上?从最初的电子枪显示器说起,电子枪逐行读取像素点,逐行发射到屏幕上,每当一行扫描完成,显示器会发出水平同步信号HSync;然后继续下一行,直到最后一行完成一帧的绘制,电子枪恢复到起点继续下一帧的绘制,显示器会发出一个垂直同步信号VSync。对于iOS设备,VSync信号的间隔是16.7ms,也就是1秒60帧。实际绘制过程中:1原创 2022-06-23 11:21:15 · 3246 阅读 · 0 评论 -
iOS之启动速度优化二进制重排和clang插装
1、点击APP图标后,内核创建APP进程2、将APP的Mach-O可执行文件mmap进虚拟内存,加载dyld程序,接下来调用_dyld_start函数开始程序的初始化3、重启手机/更新APP会先创建启动闭包,然后根据启动闭包进行相关的初始化4、将动态库mmap进虚拟内存,动态库数量太多则这里耗时会增加5、对动态库和APP的Mach-O可执行文件做bind&rebase,主要耗时在 Page In,影响 Page In 数量的是 objc 的元数据6、初始化 objc 的 runtime,如果有了闭包,由于闭原创 2022-06-17 18:15:01 · 1660 阅读 · 1 评论 -
iOS之安装包优化以及瘦身
随着业务的快速发展与持续迭代,APP的包体积也在不断增加,从之前的十几M到几十M再到上百M。安装包过大,将会影响下载转化率。google开发者大会上公布的统计数据显示:包体大小每上升 6MB,应用下载转化率就会下降 1%,而每当包体大小减少 10MB 的时候,平均下载转化率也会有 0.5-1.5% 的增长。安装包大小有下载大小和安装大小两个概念。下载大小:通过网络下载的压缩 App 大小。为了节省流量,用户下载的都是压缩包,而解压的过程也就是我们说的安装。安装大小:为 App解压后将在用户设....原创 2022-06-11 12:12:20 · 2600 阅读 · 0 评论 -
iOS之Block分类和使用注意事项
Block有三种类型:的三种类型.并都继承于NSBlock我们在讲的三种类型之前,先了解一下程序的内存分配情况,因为不同类型的分配的内存也不同.。在iOS中内存主要分为五大区域:栈区、堆区、静态区、常量区、代码段不同block类型的内存分配 结论: 没有访问 auto变量 的block 就是 __NSGlobalBlock...原创 2022-06-04 17:12:51 · 2551 阅读 · 1 评论 -
iOS常用的几种锁详解以及用法
两种锁的加锁原理特殊的互斥锁,加了递归功能ios中常见的几种锁包括OSSpinLock、信号量(Semaphore)、pthread_mutex、NSLock、NSCondition、NSConditionLock、pthread_mutex(recursive)、NSRecursiveLock、synchronized如下所示,测试锁性能的案例图(实际可能会略有偏差): 由于OSSpinLock目前已经不再安全,存在bug,官方已放弃,iOS10之后os_unfair_lock取代OSSpinLock。基原创 2022-06-02 13:29:24 · 3407 阅读 · 0 评论 -
iOS多线程之GCD
GCD(Grand Central Dispatch),是有Apple公司开发的一个多核编程的解决方案,用以优化应用程序支持多核处理器,是基于线程模式之上执行并发任务。GCD的优点1.利用设备多核进行并行运算2.GCD自动充分使用设备的CPU内核3.GCD自动管理线程的生命周期(线程创建、线程调度、线程销毁)4.使用简单GCD任务和队列任务:就是执行操作,即可以执行的代码;执行任务有两种方式:同步 和 异步。同步(sync):阻塞线程: 同步添加任务到指定的队列中,原创 2022-05-31 17:32:57 · 3065 阅读 · 0 评论 -
iOS调试之LLDB命令
前言在iOSAPP开发中,我们的代码经常需要调试跟踪,最常用的是LLDB Debugger程序调试器,LLDB Debugger (LLDB) 是一个开源、底层调试器(low level debugger),具有REPL (Read-Eval-Print Loop,交互式解释器)、C++和Python插件,可以在terminal中使用。具有流向控制 (flow control) 和数据检查 (data inspection) 功能。常用LLDB命令简单操作P和PO命令p 命令:原创 2022-05-24 10:55:21 · 2618 阅读 · 0 评论 -
iOS 程序启动dyld加载流程
当 App 中的业务模块越来越多、越来越复杂,集成了更多的三方库,App 启动也会越来越慢,因此我们希望能在业务扩张的同时,保持较优的启动速度,给用户带来良好的使用体验。热启动与冷启动当用户按下 home 键,iOS App 不会立刻被 kill,而是存活一段时间,这段时间里用户再打开 App,App 基本上不需要做什么,就能还原到退到后台前的状态。我们把 App 进程还在系统中,无需开启新进程的启动过程称为热启动。而冷启动则是指 App 不在系统进程中,比如设备重启后,或是手动杀死 App .原创 2022-05-18 21:42:42 · 2086 阅读 · 0 评论 -
iOS 消息转发(Message Forwarding)
Objective-C是动态语言,方法在运行时会被动态转为消息发送,即:objc_msgSend(receiver,selector)。objc向对象发送消息时,runtime会根据isa指针找到对象所属类,从该类及父类方法列表寻找方法运行 如果没有找到便会抛出异常 unrecognized selector sent to xxx, 但是在这之前有三次拯救机会。1.Method resolution 方法解析处理阶段如果调用了方法 首先会调用+(BOOL)resolveInstanceMetho原创 2022-05-11 19:46:06 · 3225 阅读 · 0 评论 -
iOS msgSend消息发送流程
objc_msgSend在iOS中调用方法其实就是在给对象发送某条消息。消息的发送在编译的时候编译器就会把方法转 换为objc_msgSend这个函数。objc_msgSend有俩个隐式的参数,消息的接收者和消息的方法 名。objc_msgSend这个函数就能够通过这俩个隐式的参数去找到方法具体的实现。如果消息的接 收者是实例对象,isa就指向类对象,后再通过第二个参数方法名,去类对象里面找对应的方法实 现。如果消息的接收者是类对象,isa就指向元类,就会去元类里面找对应的方法实现。通过 clang原创 2022-05-10 20:20:55 · 2591 阅读 · 0 评论 -
iOS之Runtime Api接口大全
Runtime介绍Objective-C 扩展了 C 语言,并加入了面向对象特性和 Smalltalk 式的消息传递机制。而这个扩展的核心是一个用 C 和 编译语言 写的 Runtime 库。它是 Objective-C 面向对象和动态机制的基石。Objective-C 是一个动态语言,这意味着它不仅需要一个编译器,也需要一个运行时系统来动态得创建类和对象、进行消息传递和转发。理解 Objective-C 的 Runtime 机制可以帮我们更好的了解这个语言,适当的时候还能对语言进行扩展,从系统层面原创 2022-04-25 19:53:54 · 4555 阅读 · 0 评论 -
iOS类的本质与底层探索
前言首先,我们看下几个类型:NSObject、Class、objc_object、objc_class、id的联系与区别。NSObject:OC中的基类,绝大多数类都继承NSObject(NSProxy也是基类哦~) Class:NSObject的类型,在objc源码的NSObject.mm文件中可以看到 + (Class)class { return self;} objc_object:NSObject类在C++的底层实现的结构体名称,在生成的cpp文件中可以看到,它和N原创 2022-04-24 16:28:48 · 3621 阅读 · 0 评论 -
iOS对象alloc流程和内存对齐
在探索OC对象底层本质之前,先了解一下clangClangclang是⼀个由Apple主导编写,基于LLVM的C/C++/Objective-C编译器 主要用于底层编译,将oc文件转换成c++文件,方便理解底层原理OC是面向对象的语言,开发中一切的基础,首先需要一个对象,如果没有的话,可以alloc一个。本篇文章主要探索alloc的内部执行流程。首先自定义Person继承与NSObject//创建对象 Person *person = [[Person alloc] init];原创 2022-04-18 16:11:30 · 3645 阅读 · 0 评论 -
61、Flutter插件通信原理<一>
Flutter与原生通讯 - Flutter Plugin - 知乎前言Flutter优势主要体现在UI上--高性能且跨平台表现一致。但是针对平台(Android、IOS)的实现,如:获取电量、判断WiFi使用、调起WebView加载网页等,得调用特定平台的API包。Flutter Plugin就是为调用平台API而生。下文中所提及到的"平台"指的是Android、IOS两端。介绍Flutter Plugin包含针对Android(Java或Kotlin代码)或iOS(Objecti原创 2022-04-12 08:19:16 · 3757 阅读 · 0 评论 -
AutoreleasePoolPage自动释放池原理
所有app的入口都是一个main函数int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); }}可以发现:整个 iOS 的应用都是包含在一个自动释放池 block 中的@autoreleasepool{} 本质上是一个结构体:struct .原创 2022-03-04 16:15:27 · 7420 阅读 · 0 评论 -
xcode Unable to install "xxx"
xcode运行报错出现:Unable to install "xxx"DetailsUnable to install "xxx"Domain: com.apple.dt.MobileDeviceErrorDomainCode: -402653103--Could not inspect the application package.Domain: com.apple.dt.MobileDeviceErrorDomainCode: -402653103User Info: {原创 2020-05-11 14:15:41 · 29863 阅读 · 2 评论 -
iOS KVO详解
一、概述KVO<NSKeyValueObserving>,是一个非正式协议,提供了一个途径,使对象(观察者)能够观察其他对象(被观察者)的属性,当被观察者的属性发生变化时,观察者就会被告知该变化。指定一个被观察对象(例如 A 类),当对象某个属性(例如 A 中的字符串 name)发生更改时,对象会获得通知,并作出相应处理;【且不需要给被观察的对象添加任何额外代码,就能使用 KVO ...原创 2020-04-30 16:29:36 · 20682 阅读 · 0 评论 -
iOS离屏渲染详解
iOS离屏渲染离屏渲染是指图层在被显示之前是在当前屏幕缓冲区以外开辟的一个缓冲区进行渲染操作。离屏渲染需要多次切换上下文环境:先是从当前屏幕(On-Screen)切换到离屏(Off-Screen);等到离屏渲染结束以后,将离屏缓冲区的渲染结果显示到屏幕上又需要将上下文环境从离屏切换到当前屏幕,而上下文环境的切换是一项高开销的动作。会造成 offscreen rendering 的原因有...原创 2020-04-29 10:19:33 · 21158 阅读 · 1 评论 -
pod更新慢的问题
最近使用CocoaPods来添加第三方类库,无论是执行pod install还是pod update都卡在了Analyzing dependencies不动原因在于当执行以上两个命令的时候会升级CocoaPods的spec仓库,加一个参数可以省略这一步,然后速度就会提升不少。加参数的命令如下:pod install --verbose --no-repo-updatepod upda...原创 2020-04-23 23:52:56 · 30338 阅读 · 0 评论 -
iOS异步绘制原理
在 UIView 中有一个 CALayer 的属性,负责 UIView 具体内容的显示。具体过程是系统会把 UIView 显示的内容(包括 UILabel 的文字,UIImageView 的图片等)绘制在一张画布上,完成后倒出图片赋值给 CALayer 的 contents 属性,完成显示。这其中的工作都是在主线程中完成的,这就导致了主线程频繁的处理 UI 绘制的工作,如果要绘制的元素过多,过...原创 2020-04-21 16:37:29 · 23201 阅读 · 0 评论 -
iOS 保持界面流畅的技巧
https://blog.ibireme.com/2015/11/12/smooth_user_interfaces_for_ios/原创 2020-04-21 16:04:22 · 20871 阅读 · 0 评论 -
如何统计ios开发代码行数
如果要统计ios开发代码,包括头文件的,CD到项目目录下,命令如下① 列出每个文件的行数复制代码 代码如下:find . -name "*.m" -or -name "*.h" -or -name "*.xib" -or -name "*.c" |xargs wc -l② 列出代码行数总和复制代码 代码如下:find . -name "*.m" -or -name "*.h" -or -nam原创 2015-11-10 13:20:29 · 5371 阅读 · 1 评论 -
iOS事件传递机制
前言:按照时间顺序,事件的生命周期: 事件的产生和传递(事件如何从父控件传递到子控件并寻找到最合适的view、寻找最合适的view的底层实现、拦截事件的处理)->找到最合适的view后事件的处理(touches方法的重写,也就是事件的响应)重点和难点是: 1.如何寻找最合适的view 2.寻找最合适的view的底层实现(hitTest:withEvent:底层实现)事...原创 2020-04-03 15:42:41 · 31524 阅读 · 0 评论 -
iOS中高级工程师必备知识体系与面试宝典
很多人写了很多年iOS项目,其实很多时候都是在搬砖,来回的码代码,却忘了学习新东西,随着年龄越来越大就有了职业危机感,会被市场淘汰,其实淘汰的并不是你的年龄,而是你的技术。市场一直都缺人才,缺的不是中低端人才,而是高级人才。所以作为程序员,我们每天都应该有新的收获。一、UI视图1.1事件传递机制1.2UI绘制原理1.3异步绘制原理1.4流失页面的性能优化1.5离屏渲染...原创 2020-04-03 14:59:49 · 31819 阅读 · 0 评论