获得徽章 0
- #知识小集# 「 UIViewController 预加载方案浅谈 」 by @hite和落雁
预加载作为常规性能优化方法,在所有有性能需求的场景都有使用。在 iOS 常规的优化方案中,预加载也是极常见的方法,多见于:预加载图片、配置文件、离线包等业务资源。但是对于整个 App 的核心组件 UIViewController 却少见预加载的策略。
在本文中,作者在思考和调研了 UIViewController 渲染流程和特性后,提出了自己的解决方案 ViewControllerPreRender,对比了使用该方案前后的性能,并说明了背后的原理以及适宜的场景。
有类似需求的童鞋可以参考一下。展开评论1 - WWDC19 06-04 Tuesday(美国时间) Session List评论1
- #iOS知识小集#「 如何比较日期是否为同一天 」by @halohily
在产品需求中,某个功能每天例行一次非常常见。比如,某个开关用户当天关掉之后,当天不再展示,直到新的一天第一次启动。再比如,某个功能一天有使用次数上限,直到新的一天第一次启动才恢复额度。一般我们处理这种需求都是在本地存储一个变量来记录最后一次启动的日期,在每次判断功能是否可用时,比较存储的日期和当前最新日期是否同一天。之前处理这个需求的时候,是使用 NSCalendar 对象分别生成两个 NSDate 对象的 NSDateComponents,进而分别比较年、月、日。后来发现,有一个简便的做法是使用同一个 NSDateFormatter 分别生成两个 NSDate 的 NSString,直接比较字符串是否相同即可。
与此相似的还有如何判断一个字符串是否为合法的 NSURL?最正确的办法是使用这个字符串去生成 NSURL 对象,如果返回 nil,这个字符串即为不合法。大多数人面对这个需求很可能会选择繁琐的正则匹配等方式,殊不知转换一下思路,事情会变得非常优雅且简便。展开22 - @hite和落雁 童鞋在我们这发了不少文章,为表示感谢,送上一本《重构 2》,选书的时候发现有活动,所以又加了一本《数学之美》,两本比一本还便宜一些
。感谢小集的所有作者……后续我们都会给满5篇的作者送上一本书,以表示感谢。也欢迎大家有好文章发给我们,知识小集 公众号 zsxjtip,希望能和大家分享更多好文章
评论2 - #iOS知识小集#「 UIButton 在粗体文本下的系统 bug 」
UIButton 相信大家是非常熟悉了,但是不知道大家有没有遇到这样的问题。button 同时设置了图片和文字(代码如图1所示)
然后把系统【设置】->【辅助功能】->【粗体文本】开关打开,手机会自动重启。再去查看这个 button 的时候,你会发现文字和图片发生了重叠,类似图2所示。
坑爹的发现,文字和图片叠在一起了,当时测试反馈的时候一脸懵逼,然后仔细检查代码,没啥毛病。最终找到了一种可行的解决方案,但是会稍微有点复杂。需要写一个 UIButton 的子类,代码如图3所示。
使用这个类替换掉 UIButton 之后,粗体模式下也一切正常了,这里只是做了一个小小的 trick,为了解决这个系统 bug。但是为啥能生效的原因不太清楚,如果有知道产生这个问题的真正原因和正确解决姿势的小伙伴欢迎分享。如果你也遇到了这个问题,可以暂时先用这种方式规避。展开评论2 - #iOS知识小集#「 使用__kindof关键字来扩大变量类型限定范围 」
通常来说,如果我们不确定一个变量的类型,可以使用id来代表变量的类型,但是这样做的坏处是编译器在编译时不会对真实类型进行类型检查,如果我们只是想指定一个变量为一个类的类型或其子类的类型,我们可以使用__kindof来表示。例如在图一的代码中,我们定义了一个元素类型为UIView或者UIView子类的数组,如果往数组中添加UIImageView类型的对象,编译器会报错"Incompatible pointer types initializing 'UIImageView *' with an expression of type 'UIView *'"
如图二所示,当我们使用__kindof UIView * 来对数组元素类型进行修饰时,就不会报错了。展开评论6