- 博客(336)
- 资源 (38)
- 收藏
- 关注

原创 一文读懂iOS中的Crash捕获、分析以及防治
对于iOS端开发,定位和解决Crash毕竟两个流程,首先是根据线索来分析和定位问题,得到一个大概的猜想,之后按照自己的猜想去提供外部条件,来尝试复现问题,如果问题能够成功复现并复原与线程问题相似的堆栈现场,则基本完成了90%的工作,剩下的10%才是修复此问题。对于crash比例极低的,例如没有版本相关性的,对我们的应用影响极小的,我们可以通过去做AB实验尝试去修复。2.bad_access的排查途径有哪些?3.什么情况下会产生bad_access?
2025-01-18 23:39:05
1006
3

原创 商业iOS端路由架构演进
本文中的实现方式其实就是一种责任链的实现。初步想的方案是,根据跳转的页面的优先级,做一个类似链表的结构体,然后链表的每个子元素都是一个页面跳转流程。根据「页面跳转的成功」条件去进行判断,如果某个子元素跳转成功,那么returen掉,如果失败,那么继续走到下一个链表的子元素。例如,在deeplink的跳转逻辑之中有其他跳转逻辑,如果dp失败后会走normal的路由跳转;目前商业SDK中的点击事件,会根据不同的「事件类型」+「业务类型」,去执行不同的路由跳转逻辑,然而不同的跳转事件内部又有着很复杂的跳转逻辑,
2024-11-18 10:43:36
1157
1

原创 iOS组件化 方案 实现
进一步发展,当团队涉及到转型或者有了新的立项之后,一个团队会开始维护多个项目App,而多个项目App的需求模块往往存在一定的交叉,而这个时候组件化给我们的帮助会更大,我只需要将之前的多个业务组件模块在新的主App中进行组装即可快速迭代出下一个全新App。在使用组件的服务时,通过url找到对应的block,然后通过block回调获取服务。这种方案确实解决了方案一中无法传递非常规参数的问题,使得组件间的调用更为方便,但是它依然没有解决组件依赖中间件的问题、内存中维护映射表的问题、组件的分散调用的问题。
2024-05-31 16:34:41
1896

原创 如何写好客户端技术方案
作为一个开发者,每次需求评审完事儿之后,首要的事情就是做技术方案,今天就拿我平时做技术方案的思路,写一下如何撰写出一个好的技术方案。 并会在下方附上方案模板,有不同观点的可以评论沟通。
2022-02-15 17:27:18
3721
1

原创 为什么建议iOS开发使用Swift
Swift目前已经形成了一个 完善的Apple开发生态,苹果也是发了推这个,而且从语言的排行榜也可以看出,swift一直在网上走,而且swift使用时效率更快,并且更加安全,因为每一个输入都有一个明确的类型,很少导致对象类型不符的crash,然后就是更具表达性,就是用很少的代码表达一段完整的逻辑,通过struct和enum类型可以实现这些功能,例如:同时传入的值同时遵循多个协议,Swift可以直接用&实现,而OC需要额外定义一个协议遵守另外的多个协议来处理,同时 Swift代码量明显减少,可读性更强。 他的
2022-01-24 18:54:25
6225
4
原创 225. 用队列实现栈
一个队列为主队列,一个为辅助队列,当入栈操作时,我们先将主队列内容导入辅助队列,然后将入栈元素放入主队列队头位置,再将辅助队列内容,依次添加进主队列即可。根据题意,要用两个队列来实现栈,首先我们知道,队列是先进先出,栈是后进先出。知道了以上要点,我们两个队列的用处也就一目了然了。
2024-07-23 09:30:00
330
原创 232. 用栈实现队列
请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作将元素 x 推到队列的末尾int pop()从队列的开头移除并返回元素int peek()返回队列开头的元素如果队列为空,返回 true;否则,返回 false说明:你 只能 使用标准的栈操作 —— 也就是只有size, 和is empty操作是合法的。你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
2024-07-22 16:09:21
499
原创 150. 逆波兰表达式求值
如果遇到操作符,就从栈顶弹出两个数字分别为 num2(栈顶)、num1(栈中的第二个元素);计算 num1 运算 num2 .逆波兰表达式是的代码实现很方便,用一个栈就能解决。如果遇到数字就进栈;
2024-07-09 10:30:00
176
原创 20. 有效的括号
用 栈 实现我们遍历给定的字符串 s。当我们遇到一个左括号时,我们会期望在后续的遍历中,有一个相同类型的右括号将其闭合。由于后遇到的左括号要先闭合,因此我们可以将这个左括号放入栈顶。
2024-07-05 15:44:47
670
原创 19. 删除链表的倒数第 N 个结点
一种容易想到的方法是,我们首先从头节点开始对链表进行一次遍历,得到链表的长度 L。随后我们再从头节点开始对链表进行一次遍历,当遍历到第 L−n+1 个节点时,它就是我们需要删除的节点。当遍历到第 L−n+1 个节点时,它的下一个节点就是我们需要删除的节点,这样我们只需要修改一次指针,就能完成删除操作。为了与题目中的 n 保持一致,节点的编号从 1 开始,头节点为编号 1 的节点。输入:head = [1,2,3,4,5], n = 2。输入:head = [1,2], n = 1。输出:[1,2,3,5]
2024-07-04 16:44:35
621
原创 GPT-5 一年半后发布?对此你有何期待?
像 GPT-4 这样的系统则更像是聪明的高中生智力水平,在接下来的几年里,我们期待在特定任务上达到博士的智力水平。在此分享你的见解和期待,一起畅想AI赋能下的未来!复杂任务执行与优化:在科研、工程、医疗等需要高度专业知识和技能的领域,GPT-5可以作为智能助手,协助人类完成复杂任务的规划、执行和优化。更高效的算法与计算优化:为了支撑更复杂的模型和更大的数据集,GPT-5的算法和计算架构将进行深度优化。政策制定与监管:政府应加强对AI技术的监管和引导,制定科学合理的政策框架,保障AI技术的健康发展。
2024-07-04 15:16:54
1017
原创 234. 回文链表
给你一个单链表的头节点 head ,请你判断该链表是否为。如果是,返回 true;否则,返回 false。链表中节点数目在范围[1, 105] 内。输入:head = [1,2,2,1]输入:head = [1,2]
2024-07-03 17:41:24
296
原创 21. 合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。输入:l1 = [1,2,4], l2 = [1,3,4]输入:l1 = [], l2 = [0]输入:l1 = [], l2 = []输出:[1,1,2,3,4,4]两个链表的节点数目范围是。均按 非递减顺序 排列。
2024-06-25 17:13:17
275
原创 876. 链表的中间结点
slow 一次走一步,fast 一次走两步。那么当 fast 到达链表的末尾时,slow 必然位于中间。解释:该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。给你单链表的头结点 head ,请你找出并返回链表的中间结点。输入:head = [1,2,3,4,5,6]如果有两个中间结点,则返回第二个中间结点。输入:head = [1,2,3,4,5]解释:链表只有一个中间结点,值为 3。链表的结点数范围是 [1, 100]输出:[3,4,5]输出:[4,5,6]
2024-06-24 16:04:48
356
原创 83. 删除排序链表中的重复元素
链表是排好序的,重复的元素在链表中出现的位置是连续的,我们只需要对链表进行一次遍历,就可以删除重复的元素。且第一个元素肯定是不需要移除的,所以无需 设置头结点。给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次。指向链表的头节点,随后开始对链表进行遍历。当遍历完整个链表之后,我们返回链表的头节点即可。否则说明链表中已经不存在其它与。输入:head = [1,1,2,3,3]对应的元素相同的节点,因此可以将。输入:head = [1,1,2]输出:[1,2,3]
2024-06-19 16:54:23
310
原创 203. 移除链表元素
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点。2、根据 常规链表移除节点的方式: node.next = node.next.next。输入:head = [1,2,6,3,4,5,6], val = 6。输入:head = [7,7,7,7], val = 7。输入:head = [], val = 1。即: 删除了 node.next 节点了。输出:[1,2,3,4,5]列表中的节点数目在范围。
2024-06-19 14:47:54
405
原创 「观察者(Observer)」设计模式 Swift实现
观察者设计模式(Observer Pattern)是一种行为型设计模式,它定义了对象之间的一种一对多的依赖关系,使得当一个对象的状态发生变化时,所有依赖于它的对象都会受到通知并自动更新。在这种模式中,被观察者对象(Subject)存储其观察者对象(Observer)列表,并提供了用于添加和删除观察者对象的方法。而观察者对象则实现了一个更新方法来响应被观察者状态的变化。(假如让你实现,你会怎么做)
2023-07-12 15:11:35
1367
原创 「备忘录(Memento)」设计模式 Swift实现
备忘录设计模式(Memento Pattern)是一种行为型设计模式,它可以在不破坏封装性的情况下,捕获并保存一个对象的内部状态,并在需要时恢复该对象的状态。在这种模式中,备忘录对象用于存储一个对象的状态,而负责人对象(Caretaker)用于管理备忘录对象,负责维护版本历史记录,并提供恢复对象状态的功能。
2023-06-26 16:37:56
706
原创 「中介者(Mediator)」设计模式 Swift实现
中介者设计模式(Mediator Pattern)是一种行为型设计模式,它可以促进对象之间的松耦合关系,通过集中控制这些对象之间的通信来减少对象之间的直接依赖。在这种模式中,中介者对象充当了通信的中心枢纽,其主要的功能是将对象之间的通信转移至自身,从而使这些对象之间解耦,并且更容易维护和扩展。具体来说,在中介者模式中,每个对象都有指向中介者对象的引用,通过调用中介者对象的方法来与其它对象进行协调和通信,而不是直接与其它对象进行交互。
2023-06-05 15:36:05
870
原创 「迭代器(Iterator)」设计模式 Swift实现
迭代器模式属于设计模式中的行为型模式,它可以帮助我们在遍历聚合对象时提供一种优雅的解决方案,其核心思想在于提供一个迭代器对象,提供按照一定规则遍历聚合对象的方式。Swift语言中,迭代器模式可以使用IteratorProtocol和Sequence两个系统协议来实现。其中IteratorProtocol协议用来定义一个迭代器,它必须实现一个next方法,该方法会返回聚合对象中的下一个元素。而Sequence协议用来定义聚合对象,并提供一个makeIterator()方法,用来生成所需的迭代器对象。
2023-06-02 17:54:06
310
原创 「命令(Command)」设计模式 Swift 实现
命令模式(Command Pattern)是一种行为型设计模式。命令对象可以把行动(action) 及其参数封装起来,注意,命令模式是传递行为的一种方法。它允许对调用的对象实现可逆操作,或者暴露执行历史记录。这种模式可以帮助您的代码更加灵活和可扩展。
2023-05-23 19:43:49
698
原创 「责任链 Chain Of Responsibility 」 Swift实现
责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,用于将请求连续传递给多个处理器直到被处理为止。在 Swift 中,可以使用类来实现责任链模式。需要注意的是,责任链模式不宜过长,过多地使用责任链模式会降低代码的可维护性,同时还可能会影响程序的性能。
2023-05-23 15:18:09
794
1
原创 SQL 触发器
触发器:一种与表操作有关的数据库对象,当触发器所在表上出现指定事件(新增、修改、删除数据)时,将调用该对象,即表的操作事件触发表上的触发器的执行。
2023-01-03 10:00:00
527
原创 SQL 存储过程
现需要向学生表中插入新的学生数据。但在插入学生数据的时,需要同时检查老师表里的数据。如果插入学生的老师不在老师表里,则先向老师表中插入一条老师数据,再向学生表中插入学生数据存储过程:一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,然后通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。
2023-01-02 21:07:09
842
1
原创 mysql数据库 总结
简介:介绍什么是mysql以及整套课程的大纲知识点简介:mysql的简介1、什么是mysql?mysql是一个开源的关系型数据库管理系统,现在是oracle公司旗下的一款产品,由C和C++语言编写,可移植性高。支持在多种操作系统上安装,最常见有AIX,linux,window。mysql因为开源免费,所以受到了目前互联网行业的欢迎。
2023-01-02 18:49:04
613
原创 SQL中灵活的视图
如果有很多地方都需要按上面的逻辑查询,那LEFT JOIN的脚本就需要写。比如:假如有3个学校,每个学校的学生数据在各自的表中,如何一次性查询所。复杂的关联、嵌套,导致执行计划不可控,查询性能低下;很多遍,有没有一种简写的方式?
2023-01-02 18:29:35
432
原创 连接表「INNER JOIN」「LEFT JOIN」「RIGHT JOIN」+ 多表查询
表关联执行顺序第一步:参与连接的两个表做笛卡尔积;第二步:根据ON后的连接条件筛选笛卡尔积的结果;第三步:补充左表(LEFT JOIN)或右表(RIGHT JOIN)不满足连接条件的数据(INNER JOIN内关联时无此步骤) ;第四步:根据WHERE后的过滤条件筛选第三步的结果;
2023-01-02 12:08:34
1933
1
原创 子查询+「EXISTS」 以及 组合查询UNION ALL
子查询 里边不可返回多条查询记录,否则会直接报错。上边查询后的数据如下:备注:老师表中有 teacher_name, teacher_id。 学生表中有 teacher_id 和老师表关联代码:优化代码:前伸「后边会学 表关联用法」查询后的数据如下:组合查询UNION ALLSELECT * FROM student WHERE age = 10; --查询出 14 条记录SELECT * FROM student WHERE class_id = ‘G0101’;
2023-01-01 12:29:45
924
原创 SQL 汇总统计及GROUP BY
介绍几个常用的聚集函数及使用方法,使用聚集函数实现分组统计介绍如何对分组统计的结果进行过滤?, 介绍如何对分组统计的结果进行排序?, 介绍SELECT语句中各个子句的书写顺序
2022-12-03 20:20:06
4866
原创 SQL创建新的输出字段
对单个字段或者多个字段进行数值计算;数值计算;字段拼接;字段使用别名;CASE WHEN逻辑转换;case when 逻辑嵌套
2022-12-02 08:51:54
1707
原创 SQL数据过滤
基本所有的数据库都支持百分号通配符和下划线通配符,但只有很少的数据库支持方括号通配符。SELECT 字段列表 FROM 表名 WHERE 过滤条件;过滤数据:关键字WHERE。过滤条件一般由要过滤的。字段、操作符、限定值。
2022-11-26 11:26:33
400
原创 SQL 插入数据
插入整行字段 插入整行所有字段的数据插入部分字段 插入行的部分字段的数据一次插入多行 使用一条SQL语句插入多行数据借助其他结果集插入 根据其他SQL的执行结果集来插入数据克隆表 根据一张已存在的表生成一张新表
2022-11-12 15:17:28
3294
1
转载 百度搜索引擎变现策略指标体系
百度搜索引擎变现策略指标体系4 Replies下文就百度商业变现的指标体系进行概要描述,并针对一个类似于百度LBS系统的变现思路,阐述一个商业系统变现策略指标体系的建立过程。为什么需要商业变现策略指标体系一般情况下,一个互联网产品,或是一个移动端产品在发展前期,主要会关注流量及用户量的增长。当流量,用户量做到一定程度时,就会考虑商业变现。例如今日头条,美丽说,高德地图这样的产品现在都开始商业化变现。而要从变现效果,效率衡量整个系统,以及监控技术策略对系统变现的贡献时,就需要建立一套完善的策略指标体系
2020-12-25 20:44:22
1360
shenduguanli深度管理
2022-03-01
CTO说-完整书签版
2019-05-08
iOS组件与框架 iOS SDK高级特性剖析
2017-12-29
《iOS沙龙群求职防骗指南》与《资深HR告诉你到底怎么写一份好的简历》----黑码哥
2017-12-29
图解TCP_IP_第5版
2017-12-29
资深HR告诉你到底怎么写一份好的简历--主要适用于程序员
2017-12-29
如何用 FFmpeg 编写一个简单播放器详 细步骤介绍--FFmpeg中文版
2017-12-29
信息系统监理师考试真题以及讲解汇总---信息系统监理师教程(柳纯录主编)二合一
2017-12-29
信息系统监理师考试真题以及讲解汇总
2017-12-29
The Swift Programming Language(Swift3.0中文版)
2017-12-27
强大的工具
2017-12-27
NTFS 驱动程序
2017-12-27
信息系统项目管理师教程(第2版)pdf高清版与信管网信息系统项目管理师论文精编(两本书)
2017-12-26
高项要点--10大管理知识域47个过程及工具技术
2017-12-26
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人