加入收藏 | 设为首页 | 会员中心 | 我要投稿 站长网 (https://www.0631zz.cn/)- 科技、云服务器、分布式云、容器、中间件!
当前位置: 首页 > 综合聚焦 > 人物访谈 > 人物 > 正文

极简代码:iOS设计背后的人机接口哲学

发布时间:2026-11-02 14:41:33 所属栏目:人物 来源:DaWei
导读:  V2EX上又有人把“极简代码”和“人机接口哲学”焊一块儿发帖,标题还带波浪线~我盯着那个tilde看了三秒,手已经摸到键盘想回:“你连CoreAnimation层的隐式事务都没清过,谈什么哲学?”但没发。去年7月在杭州西溪园区做支

  V2EX上又有人把“极简代码”和“人机接口哲学”焊一块儿发帖,标题还带波浪线~我盯着那个tilde看了三秒,手已经摸到键盘想回:“你连CoreAnimation层的隐式事务都没清过,谈什么哲学?”但没发。去年7月在杭州西溪园区做支付链路重构,会议室空调坏了一半,右边三台MacBook Pro风扇齐吼,像八百只蜜蜂在嚼金属屑——这声音我现在闭眼还能听见。


  当时iOS侧要交一个跨进程Token同步模块,协议文档是凌晨两点我微信语音发给对方的,对方接电话时背景里小孩在撕作业本,纸屑簌簌掉进听筒。我说“别用KVO监听UIControlState”,他嗯嗯点头,挂电话前顺手把桌上那盒没拆封的椰子水推到屏幕右下角,瓶子歪着,标签朝外,铝罐冷凝水沿着桌沿滴到地面,三滴,第四滴悬着没落下来。结果呢?他还是用KVO了,而且绑在UIButton的highlighted上。点击反馈延迟十八秒才闪一下,不是卡,是逻辑在主线程里绕了七圈,最后一圈才想起来该dispatch_async回去。我原以为是GCD队列优先级设错了,结果debug发现他new了个NSThread,然后在threadDidStart里调用了[UIApplication sharedApplication]……这个我敢打包票,断点停在那一行的时候,Xcode控制台输出了“ not in main thread, ignoring setNeedsDisplay”。


  踩坑复盘?不,是他们让我复盘。会议室投影仪老化,画面右下角有一块永远泛绿的光斑,每次切到Xcode截图就更绿,绿得像没煮熟的西兰花。CTO坐在第二排啃苹果,咔嚓咔嚓,每声都刚好卡在我讲到__weak和__unsafe_unretained区别那儿。我讲完,他把果核往纸杯里一扔,说:“能不能再‘极简’一点?”我说能啊,删掉那七百行自定义手势识别器,用系统UIGestureRecognizer,但他摇头:“太重了。”——重?UIKit.framework二十三兆,他写的那个SwiftStateMachine.swift四百行,跑起来内存占用比WKWebView实例还高。可他说重。我嘴张了半秒,没出声。窗外开始下雨,不是毛毛雨,是那种突然就砸下来的南方阵雨,玻璃上水痕往下爬,一道岔成两道,再岔,最后糊成一片。


  所谓“优胜劣汰”,就是你写三百七十二行代码实现个输入框防抖,别人拿UITextFieldDelegate+Combine三行搞定,然后你的模块在Code Review里被标红,理由写的是“冗余抽象”。我盯着那句“冗余抽象”看了十分钟,手边外卖盒里的辣子鸡丁早凉透了,花生米吸饱了油,软塌塌地躺在辣椒段里。旁边iOS组新来的实习生小林,穿灰 hoodie,袖口磨得起毛,他悄悄把AirPods塞一只进耳朵,另一只挂着晃荡,一边听我说,一边用拇指在手机备忘录里打字——后来我瞥见屏上写着“NSOperationQueue maxConcurrentOperationCount = 1 为什么不如 dispatch_semaphore_wait”,没问,反正问了他也答不上来,毕竟连CFRunLoopSourceRef怎么塞进main runloop都还没整明白。


  对,就这个——“优胜劣汰”站得住的地方,根本不是设计多美、哲学多深,就是:你写的代码扛不住CI里跑的那十二个真机回归用例,尤其是那个iPadOS横屏旋转时触发的layoutSubview死循环;你封装的API别人调一次得查三次头文件;你加的注释里写“此处为兼容iOS 14.5以下”,结果上线三天后用户投诉“键盘弹不出来”,一查,你硬编码了UIKeyboardFrameEndUserInfoKey对应值是NSValue类型,而iOS 16.4 beta4把它改成了NSDictionary。这个我说不准是不是Apple故意的,但我知道——当天夜里十一点十七分,我重写了那个KeyboardObserver类,用NotificationCenter addObserver:selector:name:object:,不传userInfo,只监听通知本身。编译通过,测试通过,凌晨一点上线。早上九点,运营同学在群里甩截图,说支付成功率回升了零点二个百分点。没人提那三百七十二行删了,就像没人记得昨天谁倒的垃圾。


  哦,还有件小事:上周三我看见PM把需求文档PDF转成Keynote,每页配手绘小人,箭头画得跟毕加索似的。其中一页写着“交互原则:减少用户思考”。底下一行小字:“按钮尺寸≥44pt,留白≥16pt,响应延迟≤100ms”。我指着那行问:“100ms算不算‘极简’?”他眨眨眼:“算。因为人类视觉暂留是133毫秒。”我嗯了一声,转身打开自己电脑,把一个UIViewController的viewDidLoad里挪出来十七行初始化代码,全塞进lazy var里——不是为了性能,纯粹因为我不想再看到那段里混着三个不同来源的第三方SDK初始化。现在那个viewDidLoad只剩五行,其中两行还是// MARK: - 。够极简了吧?可昨天Code Review又被打回来:“MARK后面没空行”。


文章配图,仅供参考

  所以现在我在写一份内部手册,叫《iOS接口开发防呆指南》,第一页就写:“别信‘哲学’,信真机log、信instruments跑出来的CPU spikes、信用户手指戳下去之后第三帧有没有commit transaction”。其余的?随它去。楼下打印机又卡纸了,咯咯咯响了八次,我懒得动。小林刚发消息问我:“ViewController生命周期里dealloc会不会在background queue执行?”我没回。反正他明天上午还会问一遍,等他真正遇到retain cycle崩在Notification中心里那天,再告诉他吧。

(编辑:站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!