- 博客(328)
- 资源 (24)
- 收藏
- 关注
原创 Loading轮子
iOS开发中,MBProgressHUD, SVProgressHUD做为Loading首先几乎是所有项目都会用到,用于网络请求过程中提示。iOS项目中使用pod引入MBProgressHUD很简单,Podfile中添加 'MBProgressHUD' pod install就完事了Android项目中也有类似的组件:KProgressHUDgithub:GitHub - Kaopiz/KProgressHUD: An implement of ProgressHUD for Androi.
2022-01-05 17:33:43
1495
原创 Android Studio编辑器使用XCode风格主题
对于习惯使用XCode开发,切换到Android Studio之后,编辑器看起来很不习惯,为了提高开发效率,XCode风格主题真是一场及时雨。插件下载github下载地址:GitHub - johncodeos-blog/XcodeKotlinColorScheme: Make Android Studio's Editor looks like XCode官方文档:How to make Android Studio's Editor looks like Xcode | John Codeos
2022-01-05 17:05:25
2003
原创 Android Studio:实现类似XCode中#pragma mark
代码行数多了之后,查找指定的方法越来越困难,影响开发效率,所以代码分组按功能分组很有必要,XCode中使用#pragma mark,Android Studio也有类似支持。在Android Studio中,您可以使用以下步骤添加区域1.打开你正在使用的IDE2.选择你想分组的代码3.按Cmd + Opt + T并select“region .. end region comments”4.现在代码被“// region”/“// endregion”线包围,你可以看到该区域可以折叠5.你
2022-01-05 16:44:09
1788
原创 iOS开发~WKWebView白屏适配
WKWebView虽好,但白屏问题也很苦恼,下面分享一下自己解决问题的过程。公司项目使用Cordova框架,做原生项目嵌入H5,业务复杂了以后,H5资源也越来越大,占用内存越来越多,加载也越来越慢,直到做热更新时候,遇到了白屏问题。第一步:有说白屏时候回调webViewWebContentProcessDidTerminate方法,那就加上吧:- (void)webViewWebContentProcessDidTerminate:(WKWebView *)webView { [w..
2021-11-03 12:17:17
4711
原创 ImportError: cannot import name ‘FieldDoesNotExist‘ from ‘django.db.models‘
环境python3.7django-filter版本过低导致。升级 pip3 install django-filter==2.4.0问题解决
2021-06-20 14:17:19
3486
原创 阿里云配置SSL证书
由于iOS和Android开发对接后端接口都需要HTTPS,当然不强制,不过需要配置一下项目,增加SSL证书过程花费了大约1天时间,原因是网上教程太杂,所以这里记录一下配置过程。环境:Server version: Apache Tomcat/8.5.34Server built: Sep 4 2018 22:28:22 UTCServer number: 8.5.34.0OS Name: LinuxOS Version: 3.10.0-693.2.2.el7.
2021-05-15 16:44:17
730
1
原创 解决flutter desktop 网络请求失败
使用了dio,模拟器和web都没问题,只有desktop不能调接口 需要在macos/Runner/DebugProfile.entitlements文件中添加com.apple.security.network.client。<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyLis
2021-05-15 14:07:47
1424
1
原创 Flutter生命周期
概要生命周期这个话题,无论iOS或Android项目都是一个必须搞明白的一点,因为这涉及到业务逻辑控制,例如Android的onCreate(),iOS的viewDidLoad(),Flutter项目也不例外,也要搞懂生命周期。Android的ActivityonCreate. onStart onResume— — — — — — — —onPause onStop (forever alone onRestart) onDestroy一般情况,登录、注册等逻辑放在onCre
2021-04-28 18:56:10
616
1
原创 Flutter网络请求dio封装
概要:dio已经更新到4.0版本,相对已经很稳定了,不过为了通用性,如果直接应用在项目中,难免比较离散。一般项目开发都是多人共同协作,所以统一的规范,简洁的调用方式,稳定的性能是必不可少的,所以才有二次封装,方便实际项目中使用。首先预览下文件结构:一、整体设计描述Api 对应项目中业务开发时候的调用接口 Code定义了常见请求状态,例如网络错误、超时、成功等 DataHelper定义了数据加密工具代码 DioLogInterceptor页面Loading拦截器,用于网络数据返回加工
2021-04-25 10:26:49
10460
6
原创 Flutter合理拆分widgets
初学Flutter,好多Demo中widgets层层嵌套,最后导致一个页面的代码量非常大,嵌套非常深,不利于维护,于是想到拆分。何时拆分:大Widget:当一个Widget非常大,嵌套层数过多,其中嵌套了很多小Widget的时候,把一个小Widget从大Widget中拆分出来,这样利于维护; 重复Widgets:当一个Widget由多个重复的小Widget组成,应当把小Widget拆分出来; 复杂Widget:当一个Widget有很多小Widgets组成,而且组合关系很复杂的时候,应该拆..
2021-04-24 15:09:37
1265
原创 Flutter项目启动白屏
Flutter项目,手机上运行正常显示页面,Chrome白屏。解决办法:Flutter在运行和构建Web应用程序时,可以在两个不同的渲染器之间进行选择。这两个渲染器是:HTML。CSS,Canvas元素和SVG元素。 该渲染器的下载大小较小。Canvaskit。使用Skia编译为WebAssembly并使用WebGL渲染。 该渲染器与Flutter移动设备和台式机完全一致,具有更快的性能,并且不太可能在浏览器之间出现差异,但下载大小增加了大约2MB。Flutter官方文档上对这个选项的默认设..
2021-04-17 11:39:57
1057
原创 Flutter设置部分主题色报错说明
问题一:给Flutter的primarySwatch设置为Colors.blue没错,设置为Colors.white则报错,肉眼看上去两者相同啊,干嘛一个报错一个不报错?primarySwatch虽然可设置主题的各类颜色,但是这里的颜色类是MaterialColor,相当于色域的意思,而像primaryColor的是Color,两者是不同的!而且纯色种的黑色和白色不是MaterialColor!所以不能设置primarySwatch为Colors.white,当前只能从以下选择:redp...
2021-04-16 10:49:47
875
翻译 SpriteKit从零开始~Visual and Audio Effects
介绍在本教程(从零开始)中的SpriteKit系列的第四部分中,我们将看一下SpriteKit提供的各种视觉和音频功能,这些功能可以为您的游戏添加更多细节和多样性。这包括粒子系统,滤镜,灯光和音频。为了跟上我,您可以使用本系列上一教程中创建的项目,也可以在GitHub上下载新副本。本系列中用于游戏的图像可以在GraphicRiver上找到。GraphicRiver是查找游戏插图和图像的理想资源。1.粒子系统在SpriteKit中,术语“粒子系统”是指由类SKEmitterNo...
2021-02-21 18:05:24
334
翻译 SpriteKit从零开始~Physics and Collisions
介绍在本教程中,这是SpriteKit从头开始的系列的第三部分,我们将详细介绍SpriteKit的物理模拟功能以及如何在2D游戏中使用它。
2021-02-19 14:53:26
523
翻译 SpriteKit从零开始~Constraints and Actions
介绍继上一篇SpriteKit基础,这一篇将学习constraints和actions。这些功能用于在SpriteKit中为游戏添加动作和动画,同时限制游戏中节点的位置和方向。您可以使用在本系列的第一个教程中创建的项目,或者在GitHub上下载新副本。1.自定义Node和Scene在向Scene中添加constraints和actions之前,我们首先需要创建一些类,以便我们代码中可以使用Node。根据iOS> Source> Cocoa Touch Class模板创建一个新类P
2021-02-09 18:17:56
433
翻译 SpriteKit从零开始~基础
介绍SpriteKit可在iOS,tvOS和OS X上使用,它是一个框架,使开发人员可以创建高质量的2D游戏,而不必担心OpenGL和Metal等图形API的复杂性。除了为开发人员处理所有图形外,SpriteKit还提供了广泛的高级功能,包括物理模拟,音频/视频播放以及游戏保存/加载。在整个系列中,您将学习有关SpriteKit的所有知识,并开发技巧,然后将其应用于使用此出色框架创建的任何2D游戏中。在本系列中,我们正在创建一个多功能游戏,玩家可以在其中控制汽车,该汽车必须避免路上的障碍。..
2021-02-07 11:27:51
1194
原创 iOS开发~清理UIWebView
苹果2020年4月拒绝还在使用UIWebView的App提交,为此要全面清除存在的UIWebView代码。1、首先检索自己代码,把UIWebView相关的代码和注释都要删掉。2、排查哪些三方库使用了UIWebView或者文案涉及到了。打开终端,cd到项目根目录。执行以下命令,就能看到哪些文件内还在有UIWebview的踪迹。 grep -r UIWebView .等查询结果出来,就可以查看到哪些库用到了webView,哪些脚本中有相关代码,删除代码,更新库引用,完美解决...
2020-09-27 16:13:25
713
原创 Flutter学习总结
1. Flutter 是什么?Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面。Flutter可以与现有的代码一起工作。在全世界,Flutter正在被越来越多的开发者和组织使用,并且Flutter是完全免费、开源的。2. Flutter 特性有哪些?快速开发(毫秒级热重载)绚丽UI(内建漂亮的质感设计Material Design和Cupertino Widget和丰富平滑的动画效果和平台感知) 响应式(Reactive,用强大而灵活的API.
2020-09-23 13:40:59
791
原创 iOS开发~Block学习总结
1、block的内部实现,结构体是什么样的?block的结构体如下:struct Block_literal_1 { void *isa; // initialized to &_NSConcreteStackBlock or &_NSConcreteGlobalBlock int flags; int reserved; void (*invoke)(void *, ...); struct Block_descriptor_1 {
2020-09-18 08:02:12
360
1
原创 iOS开发~Runloop学习总结
1、app如何接收到触摸事件的?首先,手机中处理触摸事件的是硬件系统进程 ,当硬件系统进程识别到触摸事件后,会将这个事件进行封装,并通过machPort,将封装的事件发送给当前活跃的APP进程。 由于APP的主线程中runloop注册了这个machPort端口,就是用于接收处理这个事件的,所以这里APP收到这个消息后,开始寻找响应链。 寻找到响应链后,开始分发事件,它会优先发送给手势集合,来过滤这个事件,一旦手势集合中其中一个手势识别了这个事件,那么这个事件将不会发送给响应链对象。 手势没有识别到
2020-09-18 07:38:11
587
原创 iOS开发~KVO学习总结
1、实现原理。在给对象A的属性name添加KVO观察者的时候,runtime会动态创建一个类B,这个类B继承自类A,并且重写了父类的属性name的setter方法,在重写的方法中,在给name成员变量赋值的前后,分别通知调用观察者回调。参考这篇文章2、如何手动关闭kvo?重写被观察对象的automaticallyNotifiesObserversForKey方法,返回NO 重写automaticallyNotifiesObserversOf<key>,返回NO注意:关闭k..
2020-09-18 07:37:42
519
原创 iOS开发~NSNotification相关总结
相关参考1、实现原理(结构设计、通知如何存储的、name&observer&SEL之间的关系等)参考这篇文章2、通知的发送是同步的,还是异步的?同步的3、NSNotificationCenter接收消息和发送消息是在一个线程里吗?如何异步发送消息?通知的接收和发送是在一个线程里实际上发送通知都是同步的,不存在异步操作。而所谓的异步发送,也就是延迟发送,在合适的实际发送。实现异步发送:让通知的执行方法异步执行即可 通过NSNotificationQu.
2020-09-18 06:30:16
552
原创 iOS开发~内存管理总结
1、weak的实现原理?SideTable的结构是什么样的weak:其实是一个hash表结构,其中的key是所指对象的地址,value是weak的指针数组,weak表示的是弱引用,不会对对象引用计数+1,当引用的对象被释放的时候,其值被自动设置为nil,一般用于解决循环引用的。weak的实现原理1、初始化时:runtime会调用objc_initWeak函数,初始化一个新的weak指针指向对象的地址。2、添加引用时:objc_initWeak函数会调用 objc_storeWeak() 函数
2020-09-17 16:33:53
441
原创 iOS开发~Runtime学习总结
1、Runtime的内存模型(isa、对象、类、metaclass、结构体的存储信息等)对象:OC中的对象指向的是一个objc_object指针类型,typedef struct objc_object *id;从它的结构体中可以看出,它包括一个isa指针,指向的是这个对象的类对象,一个对象实例就是通过这个isa找到它自己的Class,而这个Class中存储的就是这个实例的方法列表、属性列表、成员变量列表等相关信息的。/// Represents an instance of a class.s
2020-09-17 15:45:44
467
原创 合并两个有序数组,且合并后有序,同时去重
一、算法方案两个指针分别指向两个数组,当其中一个小于另外一个就移动该指针,反之则移动另外一个指针 如果相等则均向后移动. 结束条件是,当任意一个数组的指针移到末尾则跳出循环 把另外一个数组没有比较完的部分直接放到新数组里二、代码实现func mergeSortedArray(_ a: [Int], b:[Int]) ->[Int] { var i = 0 var j = 0 var ans = [Int]() //合并数组
2020-09-15 15:19:05
922
原创 二叉树的最近公共祖先
一、算法方案1、 如果结点 p、q 都存在且为左右结点,那么根结点 root 就是最近公共祖先;2、 如果结点 p、q 都存在且都为左结点,那么在根结点 root 的左子树查找;3、 如果结点 p、q 都存在且都为右结点,那么在根结点 root 的右子树查找。二、代码实现/** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left;
2020-09-15 14:46:47
131
原创 二叉树的深度
一、算法方案考虑以下几种情况:如果是空的二叉树,深度为0;只有根节点,深度为1;根节点只有左子树,深度为左子树的深度加1;根节点只有右子树,深度为右子树的深度加1;根节点既有左子树又有右子树,深度为取左右子树深度的最大者再加1。二、代码实现int maxDepth(struct TreeNode* root){ if (root == NULL) { return 0; } int lenLeft = maxDepth(root->l
2020-09-15 14:32:05
935
原创 单链表翻转
一、算法方案p指向第一个有效节点,头指针headpointer的指针域为空,p逐个后移,并将p指向的当前元素以头插的方式插入到头指针二、代码实现/** * Definition for singly-linked list. * struct ListNode { * int val; * struct ListNode *next; * }; */int add_node_head(struct ListNode* head, struct ListNode*
2020-09-15 14:17:20
91
原创 单链表是否相交
方法一: 暴力法对链表A中的每一个结点遍历,然后遍历整个链表B,并检查链表B中是否存在结点相同。复杂度分析时间复杂度 :(mn)(mn)。 空间复杂度 :O(1)O(1)。方法二:哈希表法遍历链表 A 并将每个结点的地址/引用存储在哈希表中。然后检查链表 B 中的每一个结点是否在哈希表中。若在,则为相交结点。复杂度分析时间复杂度 :O(m+n)O(m+n)。 空间复杂度 :O(m)O(m)或O(n)O(n)。方法三:双指针法创建两个指针pA和pB...
2020-09-15 14:03:57
184
原创 单向链表是否有环
一、算法方案1、快慢双指针法,快指针一次走两步,慢指针一次走一步,如果有环必会相遇2、集合法二、代码实现1、快慢双指针法//swift实现 public class ListNode { public var val: Int public var next: ListNode? public init(_ val: Int) { self.val = val self.next = nil } }f
2020-09-15 13:24:12
196
原创 细聊二分查找算法
1、二分法(数学领域术语)对于区间[a,b]上连续不断且f(a)·f(b)<0的函数y=f(x),通过不断地把函数f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值的方法叫二分法。二分法(Bisection method) 即一分为二的方法. 设[a,b]为R的闭区间. 逐次二分法就是造出如下的区间序列([an,bn]):a0=a,b0=b,且对任一自然数n,[an+1,bn+1]或者等于[an,cn],或者等于[cn,bn],其中cn表示[an,bn]的中点.
2020-09-15 09:58:29
988
原创 算法~十大经典排序算法
一、八大排序算法二、栈&队列三、字符串处理四、链表五、二叉树相关操作六、深搜广搜七、基本的动态规划题、贪心算法、二分查找...
2020-09-14 16:30:38
549
原创 iOS开发~App瘦身
概要App 的包大小做优化的目的就是为了节省用户流量,提高用户的下载速度,也是为了用户手机节省更多的空间。另外 App Store 官方规定 App 安装包如果超过 150MB,那么不可以使 OTA(over-the-air)环境下载,也就是只可以在 WiFi 环境下载,企业或者独立开发者万万不想看到这一点。免得失去大量的用户。同时如果你的 App 需要适配 iOS7、iOS8 那么官方规定主二进制 text 段的大小不能超过 60MB。如果不能满足这个标准,则无法上架 App Store。另一
2020-09-11 23:35:21
1118
原创 iOS开发~内存优化
一、为什么需要内存优化当我们开发iOS应用时,好的性能对我们的App来说是很重要的。你的用户也希望如此,但是如果你的app表现的反应迟钝或者很慢也会伤害到你的审核。 然而,由于ios设备的限制有时很难工作得很正确。我们开发时有很多需要我们记住这些容易忘记的决定对性能的影响。 这是为什么我写这篇文章的原因。这篇文章用备忘录的形式集合了28个技巧和诀窍可以用来提高你的app性能。所以保持阅读来给你未来的App一个很不错的提高。二、内存优化技巧以下这些技巧分为三个不同那个...
2020-09-11 15:08:56
843
原创 iOS开发~Crash优化
一、概要iOS App开发中和上线后,都会遇到程序异常退出的情况,导致崩溃的原因有很多,如果是在调试的过程中,可以通过设施断点或者打印关键信息的方式来进行调试,如果对于一些复杂模块非必现的异常崩溃,这种方式有时难以定位问题,而且对于已经发布上线的应用,这种方式更是无能为力。下面详细讨论崩溃产生的原因以及如何处理。二、Crash的捕获1、Crash产生原因1、应用中有Bug。 2、Watchdog 超时机制 3、用户强制退出 4、低内存终止 5、其他违反系统规则的操作,大部分是内存问题 .
2020-09-11 14:31:46
665
原创 iOS开发~卡顿优化
应用卡顿是让人头疼的问题,不像闪退一样直观明了,可以直接通过异常信号或调用栈分析得到,常常让人无处下手。好的用户体验需要我们把细节做到位,画面掉帧会导致卡顿感,造成不好的印象。卡顿是如何造成的,下面详细讲述。认识卡顿一些概念FPS:Frames Per Second,表示每秒渲染的帧数,通过用于衡量画面的流畅度,数值越高则表示画面越流畅。 CPU:负责对象的创建和销毁、对象属性的调整、布局计算、文本的计算和排版、图片的格式转换和解码、图像的绘制(Core Graphics)。 GPU: 负责
2020-09-10 16:00:11
1273
原创 iOS开发~耗电量优化
一、概要耗电量分析是衡量应用性能表现的一个重要指标,要做好一款app,不仅仅是实现功能,我们需要考虑很多性能指标,让用户用的更爽,在开发过程中,要充分考虑到各项性能指标,比如定位精度,更高的精度,往往意味着更高的能耗,因此要平衡好精度和功耗,避免我们的app过多的过多的电量消耗,而界面卡顿可能意味着大量的多余计算,不仅影响流畅度,影响电量消耗,网络的不合理使用,也会增加耗电量,这些都是影响耗电量和用户体验的重要因素。用户可以在设置-电量查看过去24小时及七天,自己 app 耗电情况排行榜。如果你的.
2020-09-10 11:52:27
2716
原创 iOS开发~Time Profiler使用
Time Profiler时间分析工具,能帮助我们分析代码的执行时间,找出导致程序变慢的原因下面就用三个方法来进行相关测试://NSLog-(void)printLogOC{ //代码方式获取运行时间 double dateStart = CFAbsoluteTimeGetCurrent(); for (int i = 0; i<10000; i++) { NSLog(@"---->NSLOG:%d",i); } doubl
2020-09-09 16:39:19
1213
原创 iOS开发~App启动时间优化
概要App启动时长是其性能的重要指标之一,直接影响着用户对App的第一印象。随着版本迭代,产品形态不断完善,业务功能日趋复杂,项目也从一个独立业务App逐渐演变成一个多模块项目,甚至成为一个平台型App,可能同时承载多个业务模块,因此,更多更复杂的工作需要在App启动的时候被完成,由此可见,启动速度的优化必然就是 App 开发过程中,不可或缺的一个环节。一般情况下,App 的启动分为冷启动和热启动。冷启动:App 不在系统进程中,比如设备重启后,或是手动杀死 App 进程,又或是 App 长时间
2020-09-09 14:01:59
749
原创 Swift 中的 as,as?,as! 的区别
在我的认知中,如果as能成功的话,说明as?和as!也一定会成功。在大多数情况下这是对的,但凡是总有例外。看到下面的代码,不知道你能不能看出问题。print(4 as Double) // print 4.0print(4 as! Double) // crash第一行代码成功执行,但第二行代码会有编译器⚠️,而且会造成崩溃,这是为什么呢?造成这种情况的原因就是 as 和 as? 与 as! 的执行机制不同。as 是在编译期执行的,而 as? 和 as! 是在运行时执行的。在...
2020-09-08 06:48:46
535
总览汇编寄存器,方便记忆和复习。
2020-09-15
程序员健康指南
2017-10-17
bugfree3.0.4
2015-11-24
iPhone6、6P适配Demo
2015-09-02
JavaScriptCoreDemo
2015-03-18
Core Animation(二)动画基础部分
2015-02-09
学习Core Animation例子CADemo1
2015-02-08
Slidingmenu-MenuDemo
2015-01-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人