- 博客(124)
- 收藏
- 关注
原创 Swift 中自定义运算符
Swift中自定义运算符相等运算符==相等运算符==在swift中,对于值类型(主要指结构体和枚举类型),在使用过程中总是会通过复制来进行传递,可以直接通过相等运算符来判断两者是否相等;而由于类类型是引用类型,所以并不能直接使用相等符号来进行判断....
2021-04-12 17:16:54
592
原创 二进制重排优化
二进制重排优化虚拟内存非法内存访问内存浪费ASLR二进制重排二进制重排原理如何判断缺页中断耗时使用Instruments工具设置Xcode调试参数如何查看自己工程的符号顺序如何改变二进制符号的加载顺序获取启动期间加载的所有符号编写order文件在早期的操作系统中,任何进程被加载到内存中运行时,都是按照顺序完全加载的。内存中的地址就是真实的物理地址,并且进程所需要的全部指令和数据都是一次性加载到内存中。这样就会有出现两个明显的问题:数据安全问题: 由于各个进程是按照顺序依次加载到内存中的,并且内存中的地
2021-01-28 18:11:30
1099
原创 静态代码插桩
静态代码插桩设置插桩参数代码插桩是指根据一定的策略在代码中插入桩点来统计代码覆盖的技术手段.一般可以分为三个粒度:函数(function): 按照函数为单位进行插桩;基本块(basic block): 按照代码执行单元进行分组的执行单元,单元内部的代码执行次数一定是相同的;边界(Edge): 按照代码执行路径进行插桩。针对iOS来说,clang支持以上粒度的插桩方式。这里先介绍一些函数粒度的插桩实现.设置插桩参数clang是LLVM的一个轻量级的...
2021-01-27 18:28:52
2537
1
原创 AutoreleasePool实现原理
AutoreleasePool自动释放池是如何运作的popAutoreleasePool,根据名字可以知道这是一个自动释放池,起作用就是延缓自动释放池中对象的释放时机。自动释放池是如何运作的在iOS开发中,最经常见到的AutoreleasePool就是存在于main函数中的这个:int main(int argc, char * argv[]) { NSString * appDelegateClassName; @autoreleasepool { // Setup
2021-01-26 16:55:24
422
原创 查找二叉树子节点的最近共同父节点
查找子节点的共同父节点分析实现算法复杂度其他算法题目升级给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”实例1输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8输出: 6解释: 节点 2 和节点 8 的最近公共祖先是 6。实例2输
2021-01-15 23:26:54
1436
原创 instancesRespondToSelector:与respondsToSelector:
instancesRespondToSelector:与respondsToSelector:查看源码实现object_getClass(id obj)结论instancesRespondToSelector:respondToSelector:由于iOS是一门运行时语言,所以就不可避免地需要用到自省方法来判断当前消息是否可以被处理.其中用于判断方法是否是可以被响应的一个重要方法组就是instancesRespondToSelector:和respondsToSelector:,这两个方法在使用上是否相同
2021-01-13 17:42:21
581
原创 阿里二面
阿里二面实现细节算法实现细节这一次相对于一面来讲,涉及到项目中的技术实现细节更加深入,对于实现的数据分析和逻辑漏斗追问的更加详细,由于时间比较紧张准备不足,这次面试中的技术点交流并不流畅,有些实现细节描述不清,估计会止步于此.算法这次提到最长回文字串的查找,这是一道非常常规的算法题,然而由于过于紧张只记得Manacher算法,但是对于具体的查找实现没能描述清楚,超级尴尬.其实面试官并不要求你会最牛逼的算法,只要有思路即可。比如这样一种实现:// 判断s中索引[i, j]是不是回文序列bool
2021-01-11 00:02:04
860
1
原创 NSArray类簇
NSArray 类簇NSArray, NSMutableArray类簇(class clusters)是抽象工厂模式在iOS下的一种实现,试图将多个类的实现统一在一起,对外只暴露简单的使用接口,隐藏类的真实实现。iOS中的NSArray,NSDictionary,NSArray以及NSNumber中都使用了这种实现。这里主要看一下数组的大概实现注: 以下数据使用64位模拟器演示.NSArray, NSMutableArray在iOS中,NSArray, NSMutableArray的实现中包含了很多
2021-01-10 22:29:23
480
原创 阿里iOS一面
阿里iOS一面电话内容笔试电话内容基本上简历上写的内容都可能会聊到,会针对你擅长的某一个技术点做一些场景问答,所以写在简历上的都要做深入的探究。笔试笔试有两道题,也都相对简单:以下代码输出的内容是什么,为什么?NSString *a = @"test";NSString *b = @"test";if (a ==b) { NSLog(@"Equal");} else { NSLog(@"Not Equal");}对于这题的答案,其实最初感觉字面量会被作为常量常量处理,这部分值
2021-01-09 15:53:15
193
原创 block究竟是不是对象?
block究竟是不是对象?blockblock结构block的继承关系结论blockblock是OC中经常使用到的一个实现,其实用更多的时候像是一个函数实现。而事实上,在更多的场景中,block的使用似乎更加接近于对象.那么block究竟是不是对象?block结构在apple开源的代码实现中中,可以看到block的结构:// Values for Block_layout->flags to describe block objectsenum { BLOCK_DEALLOCATI
2021-01-09 15:01:54
283
原创 leetCode 2:两数之和
两数之和分析实现算法复杂度其他算法给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例 1:输入:l1 = [2,4,3], l2 = [5,6,4]输出:[7,0,8]解释:342 + 465 = 807.示例 2:输入:l1 = [0], l2 = [0]输出:[0]示例 3:输入:l1 =
2021-01-05 19:41:58
248
原创 LeetCode 830: 较大分组的位置
较大分组的位置分析实现算法复杂度时间优化在一个由小写字母构成的字符串 s 中,包含由一些连续的相同字符所构成的分组。例如,在字符串 s = “abbxxxxzyy” 中,就含有 “a”, “bb”, “xxxx”, “z” 和 “yy” 这样的一些分组。分组可以用区间 [start, end] 表示,其中 start 和 end 分别表示该分组的起始和终止位置的下标。上例中的 “xxxx” 分组用区间表示为 [3,6] 。我们称所有包含大于或等于三个连续字符的分组为 较大分组 。找到每一个 较大分
2021-01-05 16:26:20
103
原创 LeetCode 509: 斐波那契数
斐波那契数分析实现算法复杂度时间复杂度空间复杂度其他算法斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:F(0) = 0,F(1) = 1F(n) = F(n - 1) + F(n - 2),其中 n > 1给你 n ,请计算 F(n) 。示例 1:输入:2输出:1解释:F(2) = F(1) + F(0) = 1 + 0 = 1示例 2:输入:3输出:2解释:F(3) = F
2021-01-04 22:51:21
107
原创 LeetCode 1:两数之和
两数之和分析实现算法复杂度分析时间复杂度空间复杂度其他算法给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例 2:输入:nums
2021-01-04 16:32:01
113
原创 LeetCode 86:分割链表
分割链表分析实现算法复杂度时间复杂度空间复杂度给你一个链表和一个特定值 x ,请你对链表进行分隔,使得所有小于 x 的节点都出现在大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。示例:输入:head = 1->4->3->2->5->2, x = 3输出:1->2->2->4->3->5分析单向链表是一种常用的数据结构,一般会定义个一个值域val和一个指向下一个节点的指针域next,形如:// Defin
2021-01-03 15:37:32
146
原创 算法的时间复杂度
算法的时间复杂度事后统计法估算代码执行次数对于实现每个开发者都有自己的想法,但并不是每一个算法都会得到很好的应用和推广,受限于运行环境和运行时间的要求,总是会有一些算法虽然也能够得到想要的结果但是终究会被摒弃.而评价一个算法好坏的一个重要标准就是算法的时间复杂度.对于算时间复杂度,总体上会有两种衡量方法:事后统计法对于特性的算法只要使用用例在指定的设备上进行运算就可以获取到算法执行的时间,从而评估算法在执行时间上的优劣.但是这种方法具有明显的缺陷:执行时间严重依赖于硬件以及运行时各种不确定的环境
2020-12-21 17:56:21
403
原创 LeetCode 389
找不同计数法差集法异或位运算题目描述给定两个字符串 s 和 t,它们只包含小写字母。字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。请找出在 t 中被添加的字母。计数法因为元素限定了只能是小写字母,是可以枚举的,所以可以使用元素的ascall码作为索引,出现的次数作为索引对应的值来统计元素在s中出现的次数.char *arr = malloc(sizeof(sizeof(char) * 26));for (int index = 0; index < strlen(s)
2020-12-18 18:17:47
134
1
原创 正则表达式中的捕获非捕获匹配
正则表达式中的非捕获匹配(?:pattern)(?=pattern)(?!pattern)(?<=pattern)(?<!pattern)在正则表达之使用中,经常会用到捕获匹配,即使用()进行匹配的分组会被保存在当前的执行环境变量中,从左到右以分组的括号为标志,依次编号为1,2,…,在需要时可以直接使用\1,\2…来进行引用.而在一些匹配场景中其实保存这些变量并没有任何的意义,这时候就需要用到非捕获匹配.(?:pattern)(?"pattern)表示一个非捕获分组,和捕获分组比起来,非捕
2020-12-18 15:58:21
2474
原创 属性语义问题
属性语义属性的语义特性属性的语义特性OC在进行属性声明时可以指定属性的语义特性,语义特性大致可以分为一下几中:可读属性可读属性有两个:readonly, rewrite,默认值:rewrite,可读可写会生成对应的setter和getter方法原子属性原子属性有两个:atomic, nonatomic默认值: atomic,之所以默认值是原子特性,是因为可以保持数据的存取的完整性,而实际开发中多数情况下会使用nonatomic,是因为从性能角度考虑频繁的锁操作会导致执行效率下降.
2020-12-17 16:53:17
218
原创 OC 如何实现多继承
OC实现多继承在当前类中添加其他类的实现通过协议分类通过消息转发机制由于OC是一门动态的语言,会尽可能将事件的调用延迟至运行时进行确定,所以如果OC支持多继承就有可能会在运行时发现多个父类出现具有二义性的方法实现时无法抉择的选择性困难,所以OC并不像其他静态语言一样支持多继承.虽然OC不支持多继承,但是由于OC的消息机制具有动态性,所以在需要的时候OC完全可以实现类似多继承的特性.为了方便说明,假设Class Son 需要具备 class FatherA和class FatherB的能力。在当前类中添加
2020-12-16 19:10:18
1683
原创 查找DSYM文件
查找DSYM确定DSYM文件找到DSYM文件所在的目录在iOS开发中,经常需要针对线上应用异常来定位问题,这个处理大多数情况下会由第三方的异常收集工具来完成,例如Umeng,Bugly等。但是在一些要求比较严格的场景(例如对于应用信息和安全要求比较高的金融类应用中)或者忘记上传DSYM文件的情况下,就需要我们自己来根据异常日志来处理异常.根据异常日志定位异常要做的第一步就是找到版本对应的DSYM文件.那么该如何查找这个文件呢?确定DSYM文件首先需要在Xcode中,设置生成DSYM文件,在TAR
2020-12-16 15:18:57
2074
原创 iOS KVC使用
KVCKVC是个啥NSKeyValueCodingKVC怎么使用直接设值 & 取值操作字典keyPathKVC对于标量和结构体类型的处理KVC处理数据统计其他使用技巧用KVC来访问和修改私有变量Model和字典转换操作集合KVC是个啥**KVC(key-value Coding)**即键值编码,是iOS开发中,一种可以通过键名间接访问和赋值对象属性的机制.官方文档是这么介绍的:NSKeyValueCodingA mechanism by which you can access the p
2020-12-15 18:20:57
535
原创 NSPredicate使用小总结
NSPredicate的使用为什么要使用NSPredicate?NSPredicate的使用场景MatchContainsBeginsWith && EndsWithLikeInNot逻辑运算符号为什么要使用NSPredicate?在做应用实现的过程中,经常会遇到一些筛选符合条件数据的需求,对于普通人来说,设计出一个筛选速度很快的算法并不是一件容易的事.所以iOS内部将这些实现进行了封装,便于友好地支持开发者的使用,降低使用的难度,加快开发的进程.NSPredicate的使用场景NS
2020-12-08 10:45:39
883
原创 优化if-else结构
优化if-else结构去除完全不必要的else模块价值分配提前语句检查将if-else转化为字典结构扩展应用程序if-else是日常使用较多的语法结构,但是正确使用if-else却并不是一件简单的事情,需要保证所有的逻辑都被包括且处理逻辑不会出现重叠,在一定程度上会导致设计复杂,代码的可读性差,并且可能会导致重构困难。事实上,对于else结构更应该关注的是不同场景下的实现,而不是如果进行场景划分。在很多if-else结构中,并不需要将所有的场景都进行列举,只需要将需要单独处理的场景进行特殊处理即可.这样就
2020-11-27 14:41:04
237
原创 为不同父类的所有类添加同一属性
在面向对象开发中,经常会遇到给某一些符合条件的类添加共同属性的,使得这些类的所有的对象都具有该属性的需求。一般来讲可以通过类的继承来实现这一需求,但是如果需要添加属性的类并不继承自同一父类,或者继承自同一系统类,但并不直接继承自同一个自定义类,通过在父类中添加属性让子类继承的实现就变得不够现实,这时就可以利用运行特性结合协议来实现.场景:需要为应用中的每一个控制器都添加一个tag属性用来标记各个不同的控制器。首先为UIViewController添加协议:@protocol UIViewContr
2020-11-26 10:24:59
253
原创 修改实现属性名
修改实现文件的属性名准备grep命令sed实现准备grep命令-o:只输出匹配的字符串;-E: 使用延展的正则表达式;在尝试匹配形如@property (copy, nonatomic)(^result)(UIView *view), @property(nonatomic)(^_getResult)(id res)中粗体的匹配字符串时,可以使用grep -o -E "\(\^[[:alpha:]_]+\)"在尝试匹配形如 id params;,UIViewController *co
2020-11-24 20:23:24
137
原创 grep 使用介绍
grep的使用grep的简介常用选项常用表达式(BRE)字符匹配匹配次数位置锚点分组常用操作在单个文件中检索在多个文件中检索在iOS开发中的应用grep的简介Linux中对于文本的操作常用的处理工具有三种,被称为文本处理的三剑客。grep主要用于匹配文件中的行文本搜索,通过grep可以方便地检索文件关键字,检索到需要的文本信息.grep常用的命令格式为:grep [options] [“pattern”] [file]常用选项-b: 显示匹配到的位置(byte位置);-c: 只显示匹配的结果个
2020-11-20 16:52:48
1771
原创 iOS14.x pop多个控制器时Tabbar隐藏
问题描述:在iOS14中,使用TabbarController(UITabBarController子类对象)管理NavigationController(UINavationController子类对象),然后使用navigationController(UINavigatiiontroller或者其子类)进行控制器管理,在navigationController的rootViewController上显示底部Tabbar,在其他控制器上不显示Tabbar,一般会采取在调用- (void)pus
2020-11-17 11:19:49
660
原创 Xcode 12在模拟器上编译报错
在新版的Xcode12.0中使用旧的电脑编译项目会发现原来编译正常的项目会在模拟器上报错,这是因为apple将要推出使用arm指令集的全新Mac,当时使用新的Mac的时候就需要再使用类似x86_64这样的指令集,而是可以使用和iPhone同样的指令集执行代码,所以在新版的Xcode 12中抛弃了对于模拟器指令集的默认支持,只需要在Build Setting-->User-Defined-->VALID_ARCHS中手动添加模拟器对应的指令集即可....
2020-10-13 10:07:45
769
原创 二叉树根序遍历
二叉树树,是一种常用到的数据结构,可以用来模拟具有树状结构性质的数据集合.在树的结构中,每个节点包含一个节点的值和所有节点的列表.从图的观点来看,树也可以看作是一个由N个节点和N-1条边组成的有向无环图。在树中,应用最广泛的是二叉树.正如名字中所描述的一样,二叉树的每个节点最多由两个节点(子树结构),习惯上成为左子树和右子树.二叉树的数据结构一般使用结构体来进行描述struct TreeNode { ValueType val; // 当前节点的值 struct TreeN
2020-09-09 16:06:54
1793
原创 正则表达式在OC字符串中的使用
1. 判断字符串是否合法使用正则表达式可以判断某些字符串是否符合预期结果.例如常用的判断手机号是否合法,判断字符串中是否包含中文字符串等.判断完整字符串是否合法.例如验证手机号,身份证号是否合法,网址链接是否合法等.手机号: ^1[3-9]\\d{9}$身份证号: ^[0-9]{15}$)|([0-9]{17}([0-9]|X)$中文姓名: ^[\u4E00-\u9FA5]{2,}网址链接: ^(http|https|ftp)\://([a-zA-Z0-9\.\-]+(\:[a-z.
2020-07-15 20:32:42
1024
原创 找出数组中不是成对出现的元素
题目:假设数组中的元素只有一个不是成对出现的,找出该元素(下标).思路:1. 设置一个辅助数组result,来标记数组中已经被查找的成对元素,防止重复查找;2. 遍历当前数组的元素,针对下标为i的元素:2.1 如果result[i] == 1说明该元素已经被查找过,则跳过;2.2 如果result[i] == 0,查找j > i的所有元素中是否存在nums[i]的成对元素.如果查找到则标记result[j] = 1;若未查找到则该索引i对应的元素即为需要查找的结果..
2020-06-29 17:11:18
479
2
原创 Category同名函数如何调用原来实现
Category中是原生开发中经常用到的一个技术实现,利用这一技术可以在不知道原始类实现的情况的情况下未类添加属性和方法实现,可以很好对类功能进行扩展.Category加载OC最重要的特性就是运行时,而Category之所以与众不同就在于其加载也是在运行时.在程序加载时内核会通过dyld将machO文件加载到内存进行解析,然后通过_objc_init来进行应用的初始化._objc_initvoid _objc_init(void){ //使用静态变量确保该方法不会被重复执行
2020-06-02 17:33:37
1377
原创 微信分享出现 未认证应用
微信在2019年年底更新了sdk使用universal link进行应用间回调传值,并在2020年年初呼吁开发者更新,同时声明在3.30之后开始对使用旧版本微信sdk的应用开始标注"未认证应用",并在6.1之后逐步限制旧版本sdk的使用.然而很多开发者在更新完sdk之后神奇的发现,新版本的sdk在进行分享时依然会出现"未认证应用"标注但分享功能登录等功能并不受影响.这样的开发者很多,比如鄙人我.在认真核对了微信给出的开发文档之后并做了测试之后发现:基本可以确定这就是微信内部认证的逻辑问题.对于unive
2020-06-02 12:32:53
4967
原创 flutter中的可选参数
在iOS原生开发中,只要是方法定义了形数,在方法调用时就必须在对应的位置上传递实参;在Flutter中参数定义可以定义非必选参数,可选参数,具名参数和不具名参数.非具名参数不具名参数的定义不使用{},只使用小括号即可.例如在Text控件的定义中:onst Text( this.data, { Key key, this.style, this.strutStyle, this.textAlign, ... })其中data就是不具名
2020-05-30 14:14:33
4730
原创 git使用日常
1.修改git远程仓库地址1.1 使用vim指令,直接修改.git文件本地 Git 仓库根目录下:cd .git ; 编辑 Git 配置文件:vim config ; shift +i 进入input 编辑模式 ; 修改 [remote "origin"] 下 url 的值 ; ESC 输入 x 保存退出即可;1.2 使用git remote set-url 命令...
2020-05-16 19:50:11
156
原创 如何防止应用意外崩溃(一)
如论是全栈大神,还是普通程序猿,都不能规避掉所有的异常,所以只要是人写的程序都有意外奔溃的可能,更何况操作系统本身就可能会包含一些意想不到的异常情况.随着开发经验和阅历的增加,由于自身能力问题导致的异常情况会越来越少.但异常不可避免,而应用闪退又是一种极其糟糕的用户体验,所以应该尽可能地减少甚至消除这些异常导致的闪退现象.今天重点讨论一下关于unrecognized selector sent to instance 0x......的处理.这是一个经常会遇到的异常,造成这个异常的情况的
2020-05-13 20:21:01
1011
原创 通讯录中的特殊字符
绝大多数注册类应用都会选择使用手机号作为用户的注册的账号,由于键盘上有限的字符基本都是常用的手动输入的手机号的合法性比较容易控制.但是如果用户选择粘贴的复制的方式就会混进来一些特殊的字符造成判断上的异常.在iPhone XS Max13.4.1操作系统上,复制通讯录时会发现看到的和粘贴之后的内容不一样....
2020-05-06 21:13:56
1763
原创 Block 签名信息的使用
Block在OC中却是一个非常神奇的存在,即具备了对象的特性(具备isa指针),又具备了方法的特性(具有自己的实现函数),这就自然而然注定了Block会与众不同.除了常规使用之外,还可以利用Block做一些"骚操作".Block签名在OC中中所有的方法都有编码信息,签名信息包含了方法的参数类型和返回值类型等信息.对于对象的实例方法可以利用 Method method =...
2020-04-27 16:53:13
837
原创 如何在OC中没有显示声明的方法?
在OC中调用方法时,可以直接使用显式//NSMutableArray调用array类方法NSMutableArray *arr = [NSMutableArray array];//NSMutableArray对象调用addObject方法[arr addObject:@"element"];经常会需要执行没有显示声明的方法,比如动态添加的方法,私有方法等,这些方法都不能使用...
2020-04-14 16:16:17
512
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人