iOS 开发
文章平均质量分 86
朗清风
iOS开发工程师
展开
-
二进制重排优化
二进制重排优化虚拟内存非法内存访问内存浪费ASLR二进制重排二进制重排原理如何判断缺页中断耗时使用Instruments工具设置Xcode调试参数如何查看自己工程的符号顺序如何改变二进制符号的加载顺序获取启动期间加载的所有符号编写order文件在早期的操作系统中,任何进程被加载到内存中运行时,都是按照顺序完全加载的。内存中的地址就是真实的物理地址,并且进程所需要的全部指令和数据都是一次性加载到内存中。这样就会有出现两个明显的问题:数据安全问题: 由于各个进程是按照顺序依次加载到内存中的,并且内存中的地原创 2021-01-28 18:11:30 · 1074 阅读 · 0 评论 -
静态代码插桩
静态代码插桩设置插桩参数代码插桩是指根据一定的策略在代码中插入桩点来统计代码覆盖的技术手段.一般可以分为三个粒度:函数(function): 按照函数为单位进行插桩;基本块(basic block): 按照代码执行单元进行分组的执行单元,单元内部的代码执行次数一定是相同的;边界(Edge): 按照代码执行路径进行插桩。针对iOS来说,clang支持以上粒度的插桩方式。这里先介绍一些函数粒度的插桩实现.设置插桩参数clang是LLVM的一个轻量级的...原创 2021-01-27 18:28:52 · 2458 阅读 · 1 评论 -
AutoreleasePool实现原理
AutoreleasePool自动释放池是如何运作的popAutoreleasePool,根据名字可以知道这是一个自动释放池,起作用就是延缓自动释放池中对象的释放时机。自动释放池是如何运作的在iOS开发中,最经常见到的AutoreleasePool就是存在于main函数中的这个:int main(int argc, char * argv[]) { NSString * appDelegateClassName; @autoreleasepool { // Setup原创 2021-01-26 16:55:24 · 403 阅读 · 0 评论 -
查找二叉树子节点的最近共同父节点
查找子节点的共同父节点分析实现算法复杂度其他算法题目升级给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 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 · 1399 阅读 · 0 评论 -
NSArray类簇
NSArray 类簇NSArray, NSMutableArray类簇(class clusters)是抽象工厂模式在iOS下的一种实现,试图将多个类的实现统一在一起,对外只暴露简单的使用接口,隐藏类的真实实现。iOS中的NSArray,NSDictionary,NSArray以及NSNumber中都使用了这种实现。这里主要看一下数组的大概实现注: 以下数据使用64位模拟器演示.NSArray, NSMutableArray在iOS中,NSArray, NSMutableArray的实现中包含了很多原创 2021-01-10 22:29:23 · 464 阅读 · 0 评论 -
正则表达式中的捕获非捕获匹配
正则表达式中的非捕获匹配(?:pattern)(?=pattern)(?!pattern)(?<=pattern)(?<!pattern)在正则表达之使用中,经常会用到捕获匹配,即使用()进行匹配的分组会被保存在当前的执行环境变量中,从左到右以分组的括号为标志,依次编号为1,2,…,在需要时可以直接使用\1,\2…来进行引用.而在一些匹配场景中其实保存这些变量并没有任何的意义,这时候就需要用到非捕获匹配.(?:pattern)(?"pattern)表示一个非捕获分组,和捕获分组比起来,非捕原创 2020-12-18 15:58:21 · 2419 阅读 · 0 评论 -
属性语义问题
属性语义属性的语义特性属性的语义特性OC在进行属性声明时可以指定属性的语义特性,语义特性大致可以分为一下几中:可读属性可读属性有两个:readonly, rewrite,默认值:rewrite,可读可写会生成对应的setter和getter方法原子属性原子属性有两个:atomic, nonatomic默认值: atomic,之所以默认值是原子特性,是因为可以保持数据的存取的完整性,而实际开发中多数情况下会使用nonatomic,是因为从性能角度考虑频繁的锁操作会导致执行效率下降.原创 2020-12-17 16:53:17 · 203 阅读 · 0 评论 -
OC 如何实现多继承
OC实现多继承在当前类中添加其他类的实现通过协议分类通过消息转发机制由于OC是一门动态的语言,会尽可能将事件的调用延迟至运行时进行确定,所以如果OC支持多继承就有可能会在运行时发现多个父类出现具有二义性的方法实现时无法抉择的选择性困难,所以OC并不像其他静态语言一样支持多继承.虽然OC不支持多继承,但是由于OC的消息机制具有动态性,所以在需要的时候OC完全可以实现类似多继承的特性.为了方便说明,假设Class Son 需要具备 class FatherA和class FatherB的能力。在当前类中添加原创 2020-12-16 19:10:18 · 1657 阅读 · 0 评论 -
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 · 515 阅读 · 0 评论 -
NSPredicate使用小总结
NSPredicate的使用为什么要使用NSPredicate?NSPredicate的使用场景MatchContainsBeginsWith && EndsWithLikeInNot逻辑运算符号为什么要使用NSPredicate?在做应用实现的过程中,经常会遇到一些筛选符合条件数据的需求,对于普通人来说,设计出一个筛选速度很快的算法并不是一件容易的事.所以iOS内部将这些实现进行了封装,便于友好地支持开发者的使用,降低使用的难度,加快开发的进程.NSPredicate的使用场景NS原创 2020-12-08 10:45:39 · 829 阅读 · 0 评论 -
优化if-else结构
优化if-else结构去除完全不必要的else模块价值分配提前语句检查将if-else转化为字典结构扩展应用程序if-else是日常使用较多的语法结构,但是正确使用if-else却并不是一件简单的事情,需要保证所有的逻辑都被包括且处理逻辑不会出现重叠,在一定程度上会导致设计复杂,代码的可读性差,并且可能会导致重构困难。事实上,对于else结构更应该关注的是不同场景下的实现,而不是如果进行场景划分。在很多if-else结构中,并不需要将所有的场景都进行列举,只需要将需要单独处理的场景进行特殊处理即可.这样就原创 2020-11-27 14:41:04 · 223 阅读 · 0 评论 -
为不同父类的所有类添加同一属性
在面向对象开发中,经常会遇到给某一些符合条件的类添加共同属性的,使得这些类的所有的对象都具有该属性的需求。一般来讲可以通过类的继承来实现这一需求,但是如果需要添加属性的类并不继承自同一父类,或者继承自同一系统类,但并不直接继承自同一个自定义类,通过在父类中添加属性让子类继承的实现就变得不够现实,这时就可以利用运行特性结合协议来实现.场景:需要为应用中的每一个控制器都添加一个tag属性用来标记各个不同的控制器。首先为UIViewController添加协议:@protocol UIViewContr原创 2020-11-26 10:24:59 · 237 阅读 · 0 评论 -
iOS14.x pop多个控制器时Tabbar隐藏
问题描述:在iOS14中,使用TabbarController(UITabBarController子类对象)管理NavigationController(UINavationController子类对象),然后使用navigationController(UINavigatiiontroller或者其子类)进行控制器管理,在navigationController的rootViewController上显示底部Tabbar,在其他控制器上不显示Tabbar,一般会采取在调用- (void)pus原创 2020-11-17 11:19:49 · 634 阅读 · 0 评论 -
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 · 763 阅读 · 0 评论 -
正则表达式在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 · 978 阅读 · 0 评论 -
Category同名函数如何调用原来实现
Category中是原生开发中经常用到的一个技术实现,利用这一技术可以在不知道原始类实现的情况的情况下未类添加属性和方法实现,可以很好对类功能进行扩展.Category加载OC最重要的特性就是运行时,而Category之所以与众不同就在于其加载也是在运行时.在程序加载时内核会通过dyld将machO文件加载到内存进行解析,然后通过_objc_init来进行应用的初始化._objc_initvoid _objc_init(void){ //使用静态变量确保该方法不会被重复执行原创 2020-06-02 17:33:37 · 1330 阅读 · 0 评论 -
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 · 142 阅读 · 0 评论 -
如何防止应用意外崩溃(一)
如论是全栈大神,还是普通程序猿,都不能规避掉所有的异常,所以只要是人写的程序都有意外奔溃的可能,更何况操作系统本身就可能会包含一些意想不到的异常情况.随着开发经验和阅历的增加,由于自身能力问题导致的异常情况会越来越少.但异常不可避免,而应用闪退又是一种极其糟糕的用户体验,所以应该尽可能地减少甚至消除这些异常导致的闪退现象.今天重点讨论一下关于unrecognized selector sent to instance 0x......的处理.这是一个经常会遇到的异常,造成这个异常的情况的原创 2020-05-13 20:21:01 · 951 阅读 · 0 评论 -
通讯录中的特殊字符
绝大多数注册类应用都会选择使用手机号作为用户的注册的账号,由于键盘上有限的字符基本都是常用的手动输入的手机号的合法性比较容易控制.但是如果用户选择粘贴的复制的方式就会混进来一些特殊的字符造成判断上的异常.在iPhone XS Max13.4.1操作系统上,复制通讯录时会发现看到的和粘贴之后的内容不一样....原创 2020-05-06 21:13:56 · 1745 阅读 · 0 评论 -
Block 签名信息的使用
Block在OC中却是一个非常神奇的存在,即具备了对象的特性(具备isa指针),又具备了方法的特性(具有自己的实现函数),这就自然而然注定了Block会与众不同.除了常规使用之外,还可以利用Block做一些"骚操作".Block签名在OC中中所有的方法都有编码信息,签名信息包含了方法的参数类型和返回值类型等信息.对于对象的实例方法可以利用 Method method =...原创 2020-04-27 16:53:13 · 819 阅读 · 0 评论 -
如何在OC中没有显示声明的方法?
在OC中调用方法时,可以直接使用显式//NSMutableArray调用array类方法NSMutableArray *arr = [NSMutableArray array];//NSMutableArray对象调用addObject方法[arr addObject:@"element"];经常会需要执行没有显示声明的方法,比如动态添加的方法,私有方法等,这些方法都不能使用...原创 2020-04-14 16:16:17 · 501 阅读 · 0 评论 -
网页和原生代码的交互----WKWebView
我们了解和h5和原生代码交互的原理之后,现在我们尝试解析由h5发送出来的请求中的方法名和参数。原创 2016-09-20 10:04:21 · 623 阅读 · 0 评论 -
网页和原生代码的交互----UIWebview
虽然使用原生的代码书写功能可以使应用的功能更加稳定,用户体验更佳完美,但是由于原生代码书写功能会受到审核时间相对较长,灵活性不足,页面不精彩的因素的限制,近些年来,很多的开发者都在致力于开发出来易于改写,方便发布,完成及时性页面修改等功能的语言脚本,方法和框架,比如React,React-native以及cordova框架等。 现在我们就从基本的交互开始,来研究一下不使用第三方的框架原创 2016-09-19 16:04:31 · 2840 阅读 · 0 评论 -
对象引用计数保存在哪里?
在64bit操作系统中,apple对对象中的isa进行了优化使用isa_t结构来保存关于对象的更多信息.# if __arm64__# define ISA_MASK 0x0000000ffffffff8ULL# define ISA_MAGIC_MASK 0x000003f000000001ULL# define ISA_MAGIC_VALUE 0x000...原创 2020-03-25 18:05:24 · 1046 阅读 · 0 评论 -
对象释放时都干了些啥?
在之前的介绍isa_t时,曾经提起isa中存储了has_cxx_dtor信息,如果对象不包含该标志,释放时速度会更快一些.这说明在对象释放时并不是简单的进行对象空间的释放,应该会还有一些额外的辅助操作.使用objc4-756.2源代码进行说明.对象释放过程在对象的释放过程中会调用系统或者自定义实现的deallo函数,就从这里开始.dealloc调用了_objc_rootDeallo...原创 2020-03-25 14:54:33 · 283 阅读 · 0 评论 -
weak实现原理
在ARC模式中weak关键字常常用来处理对象之间的互相强引用导致的内存泄漏问题,主要是因为使用weak修饰变量不会导致引用计数的增加不会影响对象的生命周期,而且在对象释放之后会将自动指针置空避免也指针访问问题.那么系统是和实现weak管理的?定义weak实现文件首先在Xcode中,打开汇编调试Xcode->Debug->Debug Workflow->Always S...原创 2020-03-24 18:33:36 · 952 阅读 · 0 评论 -
类结构中的class_rw_t与class_ro_t
在OC的类结构中,存在这样的结构:struct objc_class : objc_object { // Class ISA; Class superclass; cache_t cache; // formerly cache pointer and vtable class_data_bits_t bits; // clas...原创 2020-03-18 17:47:16 · 1756 阅读 · 0 评论 -
Sign In With Apple
在最新的审核指南中,出现了关于Sign In With Apple 的要求:4.8 Sign in with Apple Apps that use a third-party or social login service (such as Facebook Login, Google Sign-In, Sign in with Twitter, Sign In with Linked...原创 2020-03-13 11:58:24 · 4844 阅读 · 3 评论 -
isa_t
isa_t作用在OC的类结构中出现的第一个成员变量就是联合体isa_tstruct objc_object {private: isa_t isa;//在早期的版本中isa只是一个Class类型的指针//Class _Nonnull isa;public: // ISA() assumes this is NOT a tagged pointer obj...原创 2020-03-11 18:55:40 · 695 阅读 · 0 评论 -
自定义输出函数
有时候项目中需要使用到自定义的输出方法,来添加特定的输出信息,用以帮助我们快速定位异常。在C语言中,有一个很常用的标准输出函数printf,以该函数为基础,我们来写一个简单的实现。需求:需要额外输出函数的该日志所在方法以及在该实现中的位置(在源代码中的行数)。分开Debug模式和Release模式,使用通过定义宏,让其接收可变数目的参数,并使用printf重新定义输出,增加我们需要的参数。...原创 2018-01-17 16:04:38 · 2510 阅读 · 0 评论 -
presentingViewController与presentedViewController
UIViewController中有这样两个属性,很多开发者以为presentingViewController就是把当前控制器模态(Modal)出来的控制器,presentedViewController就是当前控制器模态(Modal)出来的控制器.presentingViewController假设一个应用keyWindow的根视图控制器是A,然后A以Modal的方式推出带导航控制器B...原创 2020-02-26 18:23:09 · 1767 阅读 · 0 评论 -
全埋点------埋点介绍
埋点在应用中,为了更好的分析用户的行为,会在特定的用户行为上进行标记,一般称这样的行为用户埋点.埋点中信息一般包含特有信息和通用信息两部分.特有信息特有信息是指只有特定的埋点才会有信息,用于区分标识该埋点的信息,如埋点的唯一标记字符串等.通用信息通用信息是指所有埋点都需要的信息.一般包括但不限于设备标识,设备模型,设备机型,操作系统版本,网络类型,地理位置信息,应用版本号,埋点触...原创 2020-02-25 11:51:18 · 2133 阅读 · 0 评论 -
NSString的语义属性为什么是copy
在声明语义属性时,一般会将NSString的语义属性声明为copy而不是一般对象使用的strong,这是为什么呢?深拷贝与浅拷贝在高级语言中,这是一个经常使用到的概念,也是在实际使用中很容易出错的一个概念.深拷贝就是以原来的对象为模版重新开辟了空间,生成了一个新的对象,与原来的对象的不在同一个内存单元中. 浅拷贝是指重新生成了一个指针,指向了原来对象对应的内存空间,所以并没有生成新的...原创 2020-01-14 17:27:49 · 223 阅读 · 0 评论 -
共用体与位域
C语言中除了结构体,还有一种很重要的结构,叫做共用体(Union).共用体定义共用体(Union)是C语言中一个特殊的数据类型,可以在相同的内存位置存储不同的数据类型,可以定义一个或者多个成员变量的共用体,但是在指定时刻,只能有一个成员变量的值是完整的有效值.union [union tag]{ member definition; member definition;...原创 2020-01-13 14:22:35 · 1637 阅读 · 0 评论 -
iOS中指令集
iOS设备指令集iOS使用了arm处理器,并根据设备的硬件性能开发了不同的指令集.arm处理器下的指令集有:armv6:主要是用在早期的iOS上,如iPhone, iPhone2, iPhone3G, 第一代、第二代 iPod Touch; armv7:iPhone3GS, iPhone4, iPhone4S,iPad, iPad2, iPad3(The New iPad), iPad ...原创 2020-01-10 10:29:23 · 1019 阅读 · 0 评论 -
OC运行时简单运用----获取类中未暴露的属性
作为iOS 开发人员,几乎所有人都或多或少听过说OC很牛逼的一个机制-运行时机制,然而对于很对人来讲在实际的开发过程中用到运行时使用场景貌似并不是很多,原因很多,比如运行时几乎是纯C的底层API,对于很多没有C语言基础的开发者来说阅读和使用并不顺畅,或者项目中使用到的技术并不经常涉及这方面的应用。其实,很多运行时的机制在日常的开发过程中,如果应用得当,会给你的开发过程带来很多意想不到的便利...原创 2016-02-24 11:00:57 · 1004 阅读 · 1 评论 -
OC运行时简单运用----动态添加属性
在开发过程中,如果经常会遇到想要给现有的类(闭源类)添加自己的属性标志的需求,如果使用继承会显得麻烦和臃肿,但是category又不支持直接添加属性,这时候我们就可以利用运行时的特性来解决这一问题。2.1 实现原理在运行时中,存在一个可以为对象动态绑定属性的方法:void objc_setAssociatedObject(id object, const void *key, id...原创 2016-03-04 14:20:29 · 722 阅读 · 2 评论 -
浮点数在内存中的存储
整型的数据在内存中以补码的形式进行存储,而浮点数却不是.一般情况下,在32bit和64bit操作系统下,float使用四个字节存储,double使用八个字节存储,但是浮点数的存储都遵从IEEE规范,使用原码进行存储.存储原理在浮点数的存储中,将浮点数分为三个部分进行存储:符号位(Sign):存储符号位,0表示正,1表示负.无论使用多少bit存储浮点数,符号位只占用1bit; 指数...原创 2020-01-02 11:50:54 · 920 阅读 · 0 评论 -
tagged pointer
产生背景在项目开发中,我们总是希望能够节约空间,减少不必要的系统开销,或者提升效率,缩短执行时间,当然有时候也会通过增加空间开销来换取执行时间的缩减。可以为了方便CPU寻址提升存取效率,多数情况下内存地址会进行对齐处理,对象地址会是指针的整数倍,所以在小数据存储上,会有很多空间并没有存储数据但是却不得不空出来.指针大小与CPU位数有关,在32位CPU上占据4个字节,在64位CPU上占据8个字节...原创 2019-06-11 15:27:06 · 966 阅读 · 0 评论 -
分类添加属性------原理篇
为分类添加属性是开发中很常见的操作,以objc4-756.2为例,看看这个操作时如何实现的.AssociationsManager所有的关联对象都由通过全局的map进行管理,这个对象就是AssociationsManager.//通过自旋锁来确保操作安全spinlock_t AssociationsManagerLock;class AssociationsManager {...原创 2019-12-25 11:31:53 · 491 阅读 · 0 评论