IOS
文章平均质量分 67
JackLee18
这个作者很懒,什么都没留下…
展开
-
iOS 本地图片扫描优化
我这里扫描的图片格式有png,jpeg,pdf,其中图片使用的扫描主要是常见图片使用方式整理,并编写相应的正则表达式进行扫描。2,对于较大的图片,按照一定的规则进行取样,并对取样后的内容获取md5值,并对获取的md5值进行比较,如果重复把比较图片路径输出。3,图片名字命名指定一个合适的规范,能够很大程度提高扫描的准确率,比如:图片名字命名不会和类名, 方法名等存在重名的情况。1,已经扫描到未使用的图片,不再参与后续重复图片的扫描。2,已经扫描到重复的图片,不再参与后续的重复图片扫描。原创 2024-09-11 21:46:05 · 349 阅读 · 0 评论 -
记录一次内存泄漏排查历程
仔细思考了发现这个函数是C,C++的函数,在执行的时候会对traceHandler默认执行retain操作,但是这个traceHandler是OC对象,释放需要OC来执行release操作,,但是ARC下已经不能手动执行release操作了。打开instruments,按照内存泄漏的流程进行检测,反复进入,退出目标ViewController,检查instruments法相并没有定位到内存泄漏的代码,为了保险起见,又参考了网上的检测流程反复多次进行检测,结果都是一样没有定位到内存泄漏的具体代码。原创 2023-11-27 17:06:29 · 396 阅读 · 0 评论 -
App Languages 批量化导入管理iOS多语言文案
目前国内软件市场早已是一片血海, 很多公司将目标瞄准了国外,因此需要适配多语言,一般流程是开发者将需要翻译的文本填写到exel中发给翻译,翻译人员对照表格翻译好以后,开发者根据翻译提供的内容将多语言文本导入到工程中,有的公司开发的有自动化的脚本可以批量导入,有的公司只能手动导入,自己最近开发了一款软件 App languages可以实现可视化的形式批量导入多语言文案。原创 2022-11-07 10:01:37 · 1529 阅读 · 1 评论 -
iOS开发代码生成器制作以及后续的感想
python自动生成代码的思路、大纲、感想原创 2022-09-07 08:44:44 · 1007 阅读 · 0 评论 -
iOS开发pod组件批量发布工具使用教程
由于历史原因,公司目前的pod组件已经有好几十个了,加上快速的迭代,每次发版以后大量组件需要发布都非常的痛苦,为了解决这个问题,开发了一个可视化的pod组件开发工具,将待发布的组件设置配置好以后,一键发布即可,组件都发布成功后可以看到发布的结果,会有弹框提示,也可以查看发布失败的原因。1,使用前需要确认待发布的组件的代 码仓库都已经clone到了本地2,为~./ cocoapods 文件夹设置一个替身,方便 后期通过替身选择索引仓库打开软件既可以看到这儿页面,点击添加按钮选择组件的文件夹(备注:.p原创 2022-06-18 15:11:24 · 1311 阅读 · 0 评论 -
iOS开发crash信息符号表解析
在实际的开发过程中,我们的app如果出现crash情况,一般会通过bugly或者firebase等工具,上报到控制台,方便我们进行分析。但是有的时候也会存在一些crash信息没有上报,我们开发无法根据测试反馈的流程复现crash的情况。针对这种情况,只能让测试把手机打开一些功能,来方便我们定位问题。具体步骤如下:共享iphone分析开关打开,这样有crash信息就会记录下来如果有crash信息就有记录下来,可以点击【分析数据】这一行进去查看,具体如下:可以选择某一个信息,进入然后分享出来。原创 2022-04-16 17:38:42 · 4149 阅读 · 0 评论 -
iOS开发如何限制NSNotification的作用范围
在实际的开发中NSNotification能够很好地解耦代码,跨层传输数据等。但是由于是全局生效的。因此有时候我们不想作用范围那么广,只想局限在某个范围内进行通知的发送与接收。最近弄了一个方案,分享给大家。我这边主要分为两部分进行处理在某个类的范围内生效 在实际的开发过程中,有时候通知的范围只在与某个类的范围内生效,也即只要是这个类创建的对象内都会生效,在app运行期间可能同时存在一个类的多个对象。针对这种情况,我这边将通知的发送,接收和类名进行了关联。这样能够保证通知只在该类相关的范围内生效。原创 2021-09-19 08:25:57 · 271 阅读 · 0 评论 -
iOS开发中NSNotification的便利使用
NSNotification的使用有几个痛点:1)无法自动释放监听;2)重复添加监听没有提示;3)使用不够便利。最近在推动项目中使用swift,将原来的OC代码写了一个swift版本分享给大家。实现原理OC版本主要通过NSObject的分类,动态绑定一个数组,每次添加通知的监听,都会创建一个proxy对象,将这个proxy对象添加到刚才动态添加的数组中。这个proxy是真正的通知的监听者。并且响应处理通知的block,释放的时候会移除监听。能够实现proxy对象释放时,自动移除监听。一个对象被释放原创 2021-09-16 07:48:04 · 362 阅读 · 0 评论 -
iOS开发沙盒管理工具swift版
之前组件化开发的时候,有写过一个OC版本的沙盒文件管理工具,最近将代码整理优化了一个swift版本,整理如下:import Foundationextension String { var `extension`:String { if let index = self.lastIndex(of: ".") { return String(self[index...]) } else { return ""原创 2021-08-27 21:38:54 · 688 阅读 · 0 评论 -
iOS 性能监控方案设计(一)
最近在搞app的性能监控。主要从启动耗时,首屏耗时,操作耗时的几个指标进行监控启动耗时 启动耗时主要分为冷启动,热启动。 其中冷启动又分为首次启动,非首次启动。冷启动:从main函数开始,到第一个用户自定义的页面出现为止(备注:这个过程中要区分一下是否是首次启动)热启动:从app即将进入前台到,app进入前台的这个过程。涉及到的函数。具体下:- (void)applicationWillEnterForeground:(UIApplication *)application{ //原创 2021-08-22 08:17:22 · 790 阅读 · 0 评论 -
谈一谈iOS开发后台下载
由于iOS系统对于后台执行任务管控比较严格,如果app没有任务继续执行,那么app在进入后台一段时间后会被系统杀死。如果下载大文件的话,需要考虑如何在app进入后台后继续下载。app保活策略 app保活是指app进入后台后,通过静默的重复执行某个后台允许的任务,保证App不被系统杀死。例如:后台播放没有声音的音频。app保活应用比较广泛,不仅仅可以实现后台下载大文件。其他的应用场景:比如用户通过一定路径进入某个比较重要的页面,但这个页面操作可能需要切换app等,为了让用户下载进入app的时候仍然原创 2021-07-12 22:57:13 · 1640 阅读 · 4 评论 -
JKNetworking完整文档
前言这个网络请求框架主要是参考了YTKNetwork的实现思路,结合自己工程进行了进一步的封装,这个框架比较适合大型业务比较复杂的app。基本组成具体功能基本功能能够正常的进行GET,POST,PUT,DELETE,HEAD,PATCT 等网络请求,能够实现文件的上传下载等功能。这个大多数网络请求都能够实现。高级功能1)支持链式网络请求所谓链式网络请求就是一个请求完了,接着执行下一个网络请求。一个网络请求开始的前提必须是上一个网络请求正常结束。允许提前结束链式网络请求2)支持类组队列的网原创 2021-05-27 07:55:13 · 439 阅读 · 0 评论 -
iOS开发性能优化大纲
前言 今年团队工作计划的一部分是性能优化,主要会涉及到内存优化,启动优化,渲染优化,卡顿优化,耗电量,网络流量优化,弱网优化等。之前写过一篇内存优化策略的文章,大家感兴趣的话,可以看下《iOS性能优化之内存篇》。目的 写这篇性能优化大纲,主要是方便大家结合自己的项目,根据大纲找出适合自己实际情况的待优化项。有目的、有步骤的进行优化。在进行性能优化前,最重要的一点需要强调一下:所有的优化要以满足业务需求为前提。优化大纲1,尽可能的减少app运行期间执行的任务数量 App运行期间执行一个个原创 2021-04-29 00:00:06 · 405 阅读 · 0 评论 -
iOS性能优化之内存篇
之前项目开发过程中也有对内存进行优化,但是并没有进行系统的优化,更多是隔一段时间优化一些。最近自己总结了一些自己的心得体会分享给大家,希望大家能够多多批评指正。app内存优化方向降低运行内存峰值1、减少不必要单例的使用,尽可能减少单例对占内存较大对象的强持有2、排查内存泄漏3、降低图片缓存工具SDWebImage最大缓存值,保证必要的流畅性4、大图尽量不要使用[UIImage imageNamed:@“”],(ps:系统会进行缓存)5、在整个app运行期间不销毁的对象能够通过一定的类似归档原创 2020-12-18 23:03:26 · 2358 阅读 · 0 评论 -
iOS为类簇动态绑定属性
为类簇绑定属性没有太多的技术含量,这边记录下,方便后续用到直接复制粘贴。具体代码如下:#import "JKThemeColor.h"#import <objc/runtime.h>static const void *vv_CGColorKey = "jk_CGColorKey";@implementation JKThemeColor+ (void)configColor:(UIColor *)color jk_CGColor:(CGColorRef)jk_CGColor{原创 2020-11-20 19:07:46 · 286 阅读 · 0 评论 -
iOS开发实现资源包增量更新
所谓资源包的增量更新是指,比如有一个资源包1.0版本, 现在如果升级到1.1本,那么只需要将1.0的版本信息发送给服务端,服务器端返回一个差分包。将这个差分包和本地的1.0的资源包进行合并生成1.1版本的资源包。差分包增量更新的优势1)节约流量,降低耗电量 之前每次升级都需要下载一个完整新版本资源包,现在每次升级只需要下载一个很小的差分包就可以了(ps:一般情况下,两次迭代之间的资源包差别很小)。由于需要下载的文件小了很多,因此手机的耗电量也降了下来。2)提高资源包更新成功率 由于移动设备原创 2020-11-06 19:17:27 · 2400 阅读 · 0 评论 -
推荐一本好书《深入浅出Vue.js》
为什么推荐这本书 之前有写博客《谈一谈标准化代码在团队中的实践》注:标准化代码是指app中从网络请求,页面渲染,事件交互的一整套成熟的,高效的,使用门槛低的技术方案。其中对于页面渲染这一块,我这边不太想使用RAC,不想掺杂太多思想只想安安静静的使用MVVM,个人感觉在页面渲染这一块前端的发展历史要比iOS长,有很多的技术方案、思想值得借鉴。由于之前了解过一些Vue,刚好想趁着这个机会深入了解一下Vue的实现原理,自己买了这本书。自己每个章节都看了三四遍,看完后对自己的帮助挺大,强烈推荐大家看下。另外.原创 2020-11-03 19:08:23 · 2843 阅读 · 0 评论 -
JKKVOHelper实现对计算属性的监听与缓存
什么是计算属性计算属性是指一个对象的一个属性的变化依赖这个对象的其他属性的变化。比如一个人的fullName 的变化依赖这个人的firstName,lastName这两个属性的变化计算属性优化的背景 项目中存在UICollectionView,UITableView 列表需要对cell的size,height进行计算的场景,目前存在两种需要优化的地方重复计算每次渲染cell的时候都会进行计算,造成了重复计算计算没有和渲染分离渲染cell的时候才进行计算,没有将渲染和计算进行分离原创 2020-09-10 01:34:03 · 494 阅读 · 0 评论 -
发现手动实现KVO的一个坑
最近项目开发用到了派生子类的知识,从网上看了一下手动实现KVO的源码,网上发现大家的源码实现差不多。好像都是从一个大佬那里抄来的。参考博客地址如下:https://tech.glowing.com/cn/implement-kvo/https://www.jianshu.com/p/bf053a28accb源码地址:https://github.com/Jerry4me/JRCustomKVODemo运行了一下源码发下源码中对与非Object类型的属性进行监听时,会崩溃。比如age,NSInt原创 2020-09-06 00:55:57 · 285 阅读 · 0 评论 -
谈一谈标准化代码在团队中的实践
在团队中推广使用标准化代码已经一年有余,最近闲下来梳理一下。实践标准化代码前面临的困境 在团队实践标准化代码之前,团队中面临的现状是:代码经历时间久,最早的是2013年左右的代码代码水平参差不齐,完全没有架构概念,修改困难代码阅读困难,每次做需求前,需要花费较多时间阅读代码理解逻辑存在重复劳动现象结果就是团队中提测总是滞后,产生的bug也多,团队没有精力去进行项目优化,团队成员普遍感觉工作较累。标准化代码的思路 为了解决这些问题,我决定在团队中实践标准化代码。主要思路如下:原创 2020-08-19 01:11:14 · 319 阅读 · 1 评论 -
cocoapod实现原理
最近在进行项目优化,有些方面需要对cocoapod进行深入的了解,从网上找到一篇很好的文章分享给大家。转载自《CocoaPods 都做了什么?》 地址:https://draveness.me/cocoapods/备注:作者很厉害,大家可以仔细看看作者其他的博客 稍有 iOS 开发经验的人应该都是用过 CocoaPods,而对于 CI、CD 有了解的同学也都知道 Fastlane。而这两个在 iOS 开发中非常便捷的第三方库都是使用 Ruby 来编写的,这是为什么? 先抛开这个话题不谈,我们转载 2020-08-15 08:01:43 · 1620 阅读 · 0 评论 -
Xcode命令行简单了解一下
最近在对开发流程进行工程化处理,优先处理的是单元测试的自动化。需要对Xcode的相关命令行进行一个全面的了解,转载了一篇文章《Xcodebuild命令使用》Xcodebuild简介Xcodebuild是命令行工具包的其中一项。命令行工具包(Command Line Tools)是一个轻量的、可以与XCode分开的、在Mac上单独下载的命令行工具包。它有两部分组成:Mac OS SDK和用户系统库目录/usr/bin下的诸多命令工具。例如:gcc/g++编译器,make、git、nase、xco转载 2020-08-12 00:25:31 · 8240 阅读 · 0 评论 -
JKNetworking 升级之JKBatchRequest优化升级
之前写了关于网络请求框架的文章《网络请求框架需求梳理》,《打造一款高稳定易扩展的网络请求框架JKNetworking》,最近结合实际的业务,对JKBatchRequest进行了升级。目的 将单个网络请求的成功回调,失败回调与JKBatchRequest的成功回调,失败回调进行分离。单个网络请求的成功回调,失败回调用来处理数据的解析与装饰。JKBatchRequest的成功回调,失败回调用来作为UI刷新的时机。这样可以是网络请求这一块的逻辑更加的清晰,同时能够减少重复刷新的情况实现 我这次创原创 2020-07-24 00:21:51 · 335 阅读 · 0 评论 -
iOS实现pod库以framework形式集成
iOS开发过程中,随着项目的业务复杂度不断提高,引入的第三方库也逐渐增多,之前是通过源码的形式集成进行编译,每次切换分支,或者切换scheme时,编译时间特别的长,严重的影响了开发效率。最近通过cocoapod插件的形式实现了通过framework的形式集成pod库,分享给大家。 主要原理使用cocoapod插件cocoapods-binary将pod库在pod install的时候编译成framework.操作步骤1,安装bundlersudo gem install bundler2,原创 2020-07-14 23:49:58 · 2114 阅读 · 2 评论 -
iOS基于KVO实现响应式编程之完结篇
最近一直在探索基于KVO实现响应式编程,之前也写了两篇相关的文章。《OC实现KVO监听block方式响应事件》,《iOS 通过KVO实现响应式编程(一)》最近方案基本完善。这边完整的和大家梳理一下。需求梳理一、监听非数组对象的属性变化二、监听数组数据的变化1)监听数组指针的变化2)监听数组元素的变化a、监听数组元素数量以及元素顺序的变化b、监听数组数组元素对应的属性的变化能够将上面所列的变化,以及详细信息通过回调的形式告知使用者。意义通过实现对数据变化的监听,我们就可以实现基于数据驱原创 2020-06-30 23:34:02 · 4716 阅读 · 0 评论 -
iOS开发发现了一个内存现象
最近无意间发现了一个内存现象,分享给大家。具体代码如下: NSMutableSet *set = [NSMutableSet new]; for (NSInteger i = 0; i < 10; i++) { AModel *amodel = [AModel new]; NSString *address = [NSString stringWithFormat:@"%p",amodel]; [set addObject:address];原创 2020-05-22 23:33:49 · 328 阅读 · 0 评论 -
iOS 通过KVO实现响应式编程(一)
之前写了一篇文章《OC实现KVO监听block方式响应事件》可以实现通过KVO监听单一元素的变化。今天主要分析一下,通过KVO实现监听数组变化的实现方案。监听数组变化,具体需要监听什么一、监听数组指针的变化(1) 数组指针由空到非空(2) 数组指针由非空到空(3) 数组指针非空到非空 ps:指针指向的对象不一样 上面这三种情况主要是针对数组作为普通的NSObject对象来进行监听。这些情况都可以通过《OC实现KVO监听block方式响应事件》这篇文章中提供的方法进行监听。二、监听数组元素原创 2020-05-09 23:54:15 · 359 阅读 · 0 评论 -
iOS开发获取tableView,collectionView reloaddata 执行结束布局生效时机
在进行iOS开发的过程中,常常需要获取到UITableView,UICollectionView执行reloaddata结束以后布局生效的时机,我这边的需求是获取这个时机进行展示打点。之前对于这两个时机的捕获分别是用了如下的方法UITableView:UICollectionView:通过查看官方文档可以知道这些方法的目的和我的并不一致,在项目的一些复杂页面就会出现这样或者那样的...原创 2020-04-01 19:21:43 · 1631 阅读 · 0 评论 -
iOS多线程下的行为管理
在iOS开发的过程中,经常会有这样的场景:在多线程下进行多任务操作,任务之间有相互的依赖,优先级关系等。为了最大可能的发挥设备的性能。我这边基于手机内核数量,cpu利用率作为app开启线程数量,以及app线程优先级调度的开关。我这里将行为分为了几个类JKSingleAction单独的一个行为@interface JKSingleAction : JKBaseAction@prope...原创 2020-01-24 12:00:27 · 3048 阅读 · 0 评论 -
iOS基于响应链以及视图层级结构的事件流动
由于项目中团队协作,以及UI层级嵌套较多,UI交互,事件传递,使用代理,因为不能够跨层,所以不太合适,而用通知的话,由于是全局的。如果页面不展示的时候,也有可能会触发事件,而且使用完也需要移除。不太符合我这边的预期。经过最近一段时间的思考,最近有了点思路,和大家分享一下。基于事件响应链事件从顶层向下层传递 主要是发送事件,同时通过nextResponder来判断是否处理事件,如果能够处理...原创 2020-01-20 19:11:41 · 635 阅读 · 0 评论 -
打造一款高稳定易扩展的网络请求框架JKNetworking
前面一篇文章梳理了网络请求库的需求《网络请求框架需求梳理》,接下来说说我这边的情况,公司的网络请求框架之前架构不够好,现在不能满足需求需要重新推到,但是每周迭代一次的频率,以及捉襟见肘的测试人力,又不允许太大的改动。为了实现网络框架足够的稳定性,扩展性,以及平稳过渡,我这边参考YTKNetwork 写了一个符合自己实际情况的网络请求库JKNetworking,由于这个名字在cocoapod上已...原创 2019-11-29 13:01:23 · 374 阅读 · 0 评论 -
网络请求框架需求梳理
最近要对公司的网络请求框架进行重构,为了打造一款好用强大的网络请求框架,梳理一下网络请求框架的需求。基本需求 能够正常的进行GET,POST,PUT,DELETE,HEAD,PATCT 等网络请求,能够实现文件的上传下载等功能。这个大多数网络请求都能够实现。高级需求1)支持链式网络请求 所谓链式网络请求就是一个请求完了,接着执行下一个网络请求。前一个网络请求开始的前提必须是上一...原创 2019-11-21 09:46:31 · 589 阅读 · 0 评论 -
说一说NSURLProtocol
最早接触到NSURLProtocol应该是在三四年前,当时有了解到微信读书好像出了一个框架,是可以实现单个接口的mock,自己研究了一下加了一点东西,通过实现匹配网络请求,来达到,网络请求内容读取指定路径的json文件,实现mock接口的操作。源码地址:https://github.com/xindizhiyin2014/JKAPIMock 虽说知道了当时NSURLProtocol可以实现...原创 2019-11-20 22:07:22 · 400 阅读 · 0 评论 -
iOS开发时图文混编解决方案
最近在开发项目时,遇到了图文混编的需求,之前对于图文混编也有了解,但是只是找找代码,凑合能用。考虑到团队中后期会经常遇到图文混编的需求,我这边参考网上的博客,整理了一下参考博客地址:https://blog.csdn.net/sinat_27706697/article/details/46270939https://blog.csdn.net/sinat_27706697/article/...原创 2019-11-13 07:57:08 · 388 阅读 · 0 评论 -
iOS内存优化之解决延迟释放
在实际开发过程中,使用NSTimer 或者 performSelector... afterdelay 在定时器事件未触发的时候,如果返回上一个页面,会由于runloop强持有target,短时间内不会释放。造成内存不能及时释放。而且等到定时器触发事件时会执行已经没有意义的逻辑运算,额外浪费资源。因此内存的及时释放也是app内存优化的一个点。NSTimer的之前的博客已经实现,这里就不多...原创 2019-10-26 22:41:20 · 1278 阅读 · 0 评论 -
iOS 解决CADisplayLink造成循环引用方案
最近在排查项目中存在的内存泄漏,今天和大家分享一个CADisplayLink造成循环引用的解决方案,造成内存循环引用的原因和NSTimer是一样的都是加入runloop后对target进行了一个强持有造成的。具体代码如下:interface CADisplayLink (JKBasicProvider)+ (CADisplayLink *)jk_displayLinkWithTarget:(...原创 2019-10-26 20:32:36 · 922 阅读 · 0 评论 -
iOS UICollectionView 避免cellsize重复计算的一些思路
上次写了JKKVOHelper以后,我这边最近增加了一个方法。主要是为了解决UICollectionView 绘制过程中cell的Size重复计算的问题。具体方法如下:/// 添加一组keyPath监听/// @param observer 观察者/// @param keyPaths keyPath数组/// @param options options/// @param con...原创 2019-10-17 09:47:40 · 519 阅读 · 0 评论 -
iOS内存优化之NSTimer存在的内存泄漏
最近开始进行内存优化了,先从NSTimer的内存泄漏说起,NSTimer的造成内存泄漏的主要原因就是循环引用,NSTimer如果只响应一次的话是不存在循环引用的。主要是repeat为YES时才存在循环引用。其中timer需要执行必须要加到runloop中才可以,schedule开头的方法默认加入了NSdefaultModel了,但是加入runloop会对timer进行一个强持有。timer的t...原创 2019-10-12 07:31:01 · 582 阅读 · 0 评论 -
iOS应用程序生命周期(前后台切换,应用的各种状态)详解
iOS的应用程序的生命周期,还有程序是运行在前台还是后台,应用程序各个状态的变换,这些对于开发者来说都是很重要的。 iOS系统的资源是有限的,应用程序在前台和在后台的状态是不一样的。在后台时,程序会受到系统的很多限制,这样可以提高电池的使用和用户体验。//开发app,我们要遵循apple公司的一些指导原则,原则如下:1、应用程序的状态状态如下:Not running 未运行 程转载 2013-12-02 14:38:45 · 1551 阅读 · 2 评论 -
initWithString与stringWithString的异同?
stringWithString是类方法,返回一个auto-released的指向NSString的指针,所以不需要手工释放(自动释放池会释放它)。initWithString是实例方法,返回一个指向NSString的指针,同时该对象的retain count为1,所以需要手工release,否则内存泄露。相同点:都可以创建一个新的NSString。转载 2013-12-10 20:43:27 · 2526 阅读 · 0 评论