说起来特别可笑,我是一名软件工程师,我刚开始工作的时候一直都好奇一件事,那就是我一直在写免费的软件,上千万用户在使用这款免费软件,公司要出服务器维护的费用,人员支出的费用... 这钱都从哪来啊?要简单说明一下我开始工作时候的背景,那是 2012 年,移动互联网在井喷式的发展,我进入了一家现在用户规模应该过亿的软件公司做 iOS 开发,当年毕业之后的工资没记错应该是一个月 7000,我还挺满意的。但是文章开头的问题一直在困扰我,我也知道公司在靠融资发展,但从我朴实的认知里,我认为公司就是应该赚钱的,而不是这样一直无休无止的花钱。那时候移动工具类的产品都还在慢慢探索商业模式,就算是应用内嵌入广告,面对几十人的团队和服务器费用,那也是杯水车薪啊... 所以真的特别困惑,为啥要傻了吧唧的做赔钱的买卖啊,不过困惑归困惑,每个月工资还是按时到账,我也就慢慢把这事放下了。后来又入职了一家手机公司还是在做免费的软件,这次终于知道公司是靠卖手机赚钱的,手机里内嵌一些应用也是能靠预装赚钱的,但是公司还是一直靠融资续命... 我感觉隐隐不对劲,但是似乎外面世界都是这样,拿钱烧钱创业。直到 20 年前后,互联网公司开始在慢慢裁员,我才觉得事情好像对了起来,融资到账的钱总有要花完的时候,击鼓传花的游戏要有人买单,当公司始终不挣钱的时候,大家才冷静下来,意识到盈利的重要性。现在不管是大厂小厂,如果没有盈利,老板大概会比较焦虑。这层焦虑轻一点传导下来就是逼着员工的加班,严重一点的话就是直接裁员了,再严重公司就直接破产。融资环境也不好,拿钱这件事变难了很多;互联网内卷,盈利也变得很难,所以怎么想办法降本增效成了老板一直在关注的话题。最近几年我才觉得到原来自己朴素的商业常识是没问题的,公司还是要赚钱的;投资人前期投资,人家最后也是要变现退场的,疯狂的时代最终还是要落幕的。
macOS 大部分带前进/后退(返回)的软件中,这两个功能的快捷键设置都不一样,这就导致需要记忆同样功能的不同快捷键,很容易记忆混乱。比如 Notion,印象笔记里前进快捷键对应 ⌘+],返回对应⌘+[。比如对于 Xcode 来说前进就是⌃+⌘+→,后退是⌃+⌘+←。比如对于 VSCode 来说前进是Ctrl+⇧+-。比如对于 IDEA 来说,前进是 ⌘+⌥+→,后退是⌘+⌥+←。等等... 如果想要尝试记住不同软件中的这些不同快捷键,简直是灾难,不过有一种方式可以将这些软件中的前进/后退操作全部统一。那就是使用系统级的快捷键盘配置,配置入口如图
野指针是指指向未知或者无效内存地址的指针。出现野指针的场景是实例对象被释放之后,指向对象的指针并没有被置空,还是指向原来的内存地址,这时候访问这个指针就可能会出现野指针错误。野指针错误对应的 Mach Exception 类型 EXC_BAD_ACCESS,对应的 Signal 是 SIGSEGV 和 SIGBUS。
在 iOS 开发中内存管理从 MRC 向 ARC 以及编程语言从 OC 向 Swift 过度的过程中,野指针问题已经很少出现了,但也还是可能会有相关的野指针的问题,比如 delegate 使用 assign 修饰、使用 _unsafe_unretain 去修饰对象指针,以及 ARC 对 self 的内存管理(参考Sunny老师的这篇文章),ARC 的机制不光是要保证内存安全,也同时要兼顾性能,所以像上面一些极个别场景下还是会出现内存问题。
这篇文章尝试找到检测内存泄漏的方法。
在 iOS 开发中 MRC 向 ARC 过度以及 OC 向 Swift 过度的过程中,野指针问题已经很少出现了,但也还是可能会有相关的野指针的问题,参考Sunny老师的这篇文章,ARC 的机制不光是要保证内存安全,也同时要兼顾性能,所以像上面一些极个别场景下还是会出现内存问题。
跑题了。
iOS 中内存泄漏的场景主要是两个 1️⃣循环引用 2️⃣忘记释放。
日常开发中我们最关注的一个指标就是 App 的崩溃率,所以「如何提升应用的稳定性」这个话题就显得比较重要。
这篇文章尝试从项目层面以及 Crash 防护层面来聊聊我理解的提升稳定性的方法。
项目层面
功能开关
当项目要增加一个技术相关的模块儿,比如我们开发了一个基于 Runloop 监听卡顿的技术需求,假设测试同事在测试的时候并没有覆盖到所有的测试场景,同时这个技术需求开发的有问题,可能会导致崩溃。那上线之后可能我们项目的崩溃率就会提升。
这种场景我们其实可以做一个服务器开关,客户端通过在运行时发送网络请求来确定是否运行技术需求的相关代码,如果出现了线上的崩溃问题,我们可以及时的关闭对应的功能,保证项目的稳定性。
本文罗列一下目前项目中遇到的崩溃的场景以及对崩溃的理解。
崩溃场景
dispatch_group 非对称调用
Firebase 后台看到的异常信息
BUG IN CLIENT OF LIBDISPATCH: Unbalanced call to dispatch_group_leave()
本文关注如下几个问题
- iOS 平台上离屏渲染的概念?
- 为什么需要离屏渲染?
- 离屏渲染到底好还是不好?能避免离屏渲染吗?如何优化?
之前聊聊iOS渲染这篇文章里介绍了正常情况下渲染视图的架构方式,如图,那什么是离屏渲染?
本文尝试回答几个问题。
- CALayer 是什么
- drawRect 和 CALayer 的关系
- 一个视图是如何渲染到屏幕上的?
视图的基本展示单元 CALayer
我们在 iOS 日常开发用到的最常用的视图控件就是 UIView。大多数开发者也知道 UIView 是对 CALayer 的一次封装,CALayer 属性才是真正的控制展示的部分。对 UIView 来说,我们操作 UIView 的 backgroudColor 之类的属性,其实本质上是对 CALayer 的操作,CALayer 管理着所有可视化内容的选项。
2023年8月4号国内工信部发了关于展开移动互联网应用程序备案的通知。包括不同平台(iOS/Android)上的移动应用以及各种平台的小程序,都需要进行备案了。这篇文章介绍的是 iOS 平台上个人开发者身份应用的备案方案,Android 平台也可以参考。 小程序则应该是去各个小程序平台去申请,这里不做介绍。
最近几个用户给我反馈说打开复制板键盘拓展后,每次切出应用再切回来,键盘高度都会变高一些,我在我的 iPhone12 iOS17 上试了试确实如此。
