![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
iOS学习笔记
文章平均质量分 89
CaicaiNo.1
这个作者很懒,什么都没留下…
展开
-
iOS开发-关于iOS13.4的UITextMultiTapRecognizer问题记录
UITextMultiTapRecognizer 在 iOS 13.4上,点击 UITextField 时,会由UITextMultiTapRecognizer 触发事件。通过 hook UIApplication的sendAction:to:from:forEvent:- (BOOL)growing_sendAction:(SEL)action to:(id)target from:(id)sender原创 2020-09-22 17:53:45 · 403 阅读 · 0 评论 -
iOS开发 - 创建自定义的brew仓库oclint-0.15
文章目录背景创建仓库brew create创建tap使用参考文档背景项目需要使用 oclint 0.15 版本,并添加一定的规则 rule ,这里oclint 0.13版本之后就没有再更新了,两个版本由于clang版本不同,不能共用,如果让每个人去拉包,然后替换,太繁琐了,这里创建一个brew库用于快速集成。在 Homebrew 的架构下,至少有 4 层概念Keg(酒桶):安装好的脚本、软件等;Cellar(酒窖):所有用 Homebrew 安装在本地的脚本、软件组成的集合;Formula(配原创 2020-07-16 13:00:42 · 547 阅读 · 0 评论 -
iOS开发 - OCLint自定义规则的编译与Xcode调试
OCLint的编译基于版本 oclint version 0.15OCLint 需要自定义规则的话需要自己编译原创 2020-06-23 19:53:41 · 1949 阅读 · 0 评论 -
iOS开发 - method swizzle方式的选择
文章目录1 method swizzle方式的选择1.1 错误的swizzle方式1.2 正确的swizzle方式1.3 案例1 method swizzle方式的选择1.1 错误的swizzle方式根据 right-way-to-swizzle 文章的阐述,当我们进行方法交换时,实质是交换了objc_method结构体中的IMP函数指针struct objc_method SEL method_name OBJC2_UNAVAILABLE; char *meth原创 2020-06-16 19:26:22 · 487 阅读 · 0 评论 -
iOS开发-Audio Unit错误之CrashIfClientProvidedBogusAudioBufferList
类似堆栈如下:* thread #10, name = 'AURemoteIO::IOThread', stop reason = EXC_BAD_ACCESS (code=1, address=0x201862df8) * frame #0: 0x00000002276974e4 AudioToolbox`CrashIfClientProvidedBogusAudioBufferList + 64 frame #1: 0x00000002277ed378 AudioToolbox`Audio原创 2020-05-17 12:52:20 · 1347 阅读 · 0 评论 -
iOS开发-NSObject的alloc函数执行
文章目录前言流程callAllocallocWithZone对流程的影响_class_createInstanceFromZone方法init和new前言探索下alloc的方法执行流程debug来调试runtime源码,执行以下逻辑:NSObject *objc1 = [[NSObject alloc] init];id __weak objc2 = objc1;id __weak objc3 = objc2;流程callAlloc调用 callAlloc// Calls [cls a原创 2020-05-10 16:58:38 · 390 阅读 · 0 评论 -
iOS开发-FBRetainCycleDetector中的深度优先搜索DFS
文章目录图有向图图的实现方式遍历广度优先搜索 BFS深度优先搜索 DFSFBRetainCycleDetector的应用最近复习 FBRetainCycleDetector 源码的时候,需要的图的查询方法,深度优先搜索,这里记录下,便于系统复习。这里仅仅为分析FBRetainCycleDetector实现原理,采用深度优先搜索DFS图图由顶点(vertex)和边(edge)组成,通常表示为...原创 2020-05-01 12:06:38 · 552 阅读 · 0 评论 -
iOS开发-MLeaksFinder原理学习
文章目录内存泄漏原理MLeaksFinder 是WeRead团队开源的iOS内存泄漏检测工具,用于检测内存泄漏内存泄漏app内存有3中Leaked memory: 应用程序未引用的内存不能再次使用或释放(也可以使用Leaks仪器检测到)Abandoned memory: 应用程序仍然引用的内存没有任何用处Cached memory: 仍然被应用程序引用的内存,可以再次使用以...原创 2020-05-01 10:15:57 · 1756 阅读 · 0 评论 -
iOS开发-weak引用以及sidetable表
文章目录__weaksidetable对象的释放__weakid obj = [[NSObject alloc] init];@autoreleasepool { id __weak obj1 = obj; NSLog(@"%@",obj1);}括号内的代码编译器会转化为:id obj1;objc_initWeak(&obj1,obj);id tmp = objc_l...原创 2020-04-28 23:28:18 · 2406 阅读 · 0 评论 -
iOS开发-线程死锁
文章目录线程死锁互斥锁和自旋锁iOS的常见的锁线程死锁线程死锁的4个必要条件:互斥:一个资源每次只能被一个进程使用占有且等待:一个进程本身占有资源(一种或多种),同时还有资源未得到满足,正在等待其他进程释放该资源不可抢占:别人已经占有了某项资源,你不能因为自己也需要该资源,就去把别人的资源抢过来循环等待:存在一个进程链,使得每个进程都占有下一个进程所需的至少一种资源。进程和线程的...原创 2020-04-29 16:48:04 · 701 阅读 · 0 评论 -
iOS开发-class_ro_t和class_rw_t的区别
文章目录class_ro_tclass_rw_tclass_rw_t生成时机分类方法加载到class_rw_t的流程class_ro_tclass_ro_t存储了当前类在编译期就已经确定的属性、方法以及遵循的协议,里面是没有分类的方法的。那些运行时添加的方法将会存储在运行时生成的class_rw_t中。ro即表示read only,是无法进行修改的。struct class_ro_t {...原创 2020-04-27 23:26:57 · 5749 阅读 · 0 评论 -
iOS开发-一个 NSObject 对象占用多少内存空间
一个 NSObject 对象占用多少内存空间?在64位CPU中,NSObject 对象占用大小为16字节,其中8字节为指针大小,8字节为实例对象结构体所占大小。在32位CPU中,NSObject 对象占用大小为8字节,其中4字节为指针大小,4字节为实例对象结构体所占大小。可以参考唐巧的 深入理解Tagged Pointer故所以当4个字节就能表示的值,要用8个字节来存储时,就会很浪费内...原创 2020-04-27 20:52:31 · 1283 阅读 · 0 评论 -
iOS开发-关于block块的实现
文章目录block的结构体没有引入变量的block引入变量的block引入常量引入block引入 __attribute__((NSObject)) 变量引入__block前缀变量访问__block的变量(声明范围内)访问__block的变量(block内)引入的__attribute__((NSObject)) __block 变量block 的释放block 嵌套Object-C扩展block...原创 2020-04-26 17:32:28 · 213 阅读 · 0 评论 -
iOS开发-NSNotification源码原理学习
文章目录问题1. 实现原理对于addObserver方法,为什么需要object参数?都传入null对象会怎么样addObserver源码逻辑2.通知的发送时同步的,还是异步的3. NSNotificationCenter接受消息和发送消息是在一个线程里吗?如何异步发送消息4.NSNotificationQueue和runloop的关系5.如何保证通知接收的线程在主线程6.多次添加同一个通知会是...原创 2020-04-25 18:13:28 · 1241 阅读 · 3 评论 -
iOS开发-airpods的音频event适配
文章目录单耳机拿下iOS 7.1 BeforeMPRemoteCommandCenter双耳机取下对于airpods的适配,主要适配其单耳机拿下pause,以及恢复和双耳机取下等情景的适配。单耳机拿下对于这些事件,airpods单耳机拿下属于pause事件Event,我们使用MediaPlayer框架。iOS 7.1 Before在iOS 7.1之前,系统提供了#import <...原创 2020-04-21 16:11:47 · 1339 阅读 · 1 评论 -
iOS开发-对多个对象进行消息转发
文章目录目的实现目的参考NSProxy的实现,那么我们需要通过对多个消息的转发如何做呢?如何存储对象,强引用集合对象已经不可取,会使得对象引用计数+1,所以可以采用OC中弱引用集合 NSPointerArray参考以下文章:http://www.isaced.com/post-235.htmlhttps://www.jianshu.com/p/9d1c34999f3e通过消...原创 2020-04-19 00:46:24 · 427 阅读 · 0 评论 -
iOS开发-KVO下的isa-swizzling
文章目录前言探索1. 引用问题2. KVO原理前言对于KVO技术,开发中使用较多,能够监听值的改变。探讨下KVO的技术实现,KVO接口如下:@interface NSObject(NSKeyValueObserverRegistration)/* Register or deregister as an observer of the value at a key path relat...原创 2020-04-18 15:48:54 · 362 阅读 · 0 评论 -
iOS开发-isKindOfClass和isMemberOfClass
文章目录前言源码前言isKindOfClass和isMemberOfClass多多少少都用过isKindOfClass 方法调用者是传入的类的实例对象,或者调用者是传入类的继承者链中的类的实例对象,则返回YES。isMemberOfClass:returns YES if the receiver is an instance of the specified class.方法调用者...原创 2020-04-18 12:25:17 · 334 阅读 · 0 评论 -
iOS开发-关于+load和+initialize
文章目录执行时机loadinitializemethod swizzle最近面试遇到这样的问题,一般来说我们会在+load和+initialize进行method swizzle,那么两个方法差异在哪里执行时机load+load方法是在main函数之前被调用,先调用类的+load,再调用分类的+load,且每个+load方法只执行一次。这里的只执行一次是值得是每个文件中执行一次,因为类要...原创 2020-04-18 11:17:25 · 454 阅读 · 0 评论 -
iOS开发-main函数之前app做了哪些事
文章目录main之前1.加载可执行文件(App 的`.o `文件的集合)2.加载动态链接库,进行 rebase 指针调整和 bind 符号绑定;3.Objc 运行时的初始处理,包括 Objc 相关类的注册、category 注册、selector 唯一性检查等;4.初始化,包括了执行 +load() 方法、attribute((constructor)) 修饰的函数的调用、创建 C++ 静态全局变...原创 2020-04-16 22:45:22 · 887 阅读 · 0 评论 -
iOS学习笔记-KVC技术
文章目录https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/KeyValueCoding.htmlhttps://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Key...原创 2020-04-16 01:36:12 · 210 阅读 · 0 评论 -
iOS开发-如何解决静态库的冲突问题
文章目录问题静态库Fat文件thin文件.a文件的构成解包将.o合并为.aduplicate问题各个架构的支持问题iOS中进入静态库经常会出现 dulipcate symbols 的问题。分享下我的处理以及经验。静态库在 iOS 中静态库有.a和framework文件。下面讲解如何对静态库解包和处理冲突的问题。Fat文件首先需要了解的是,一般来说我们拿到的静态库都是Fat文件,我们都...原创 2020-04-08 12:44:45 · 1842 阅读 · 1 评论 -
iOS开发-dispatch_once相关
文章目录使用场景原理关于dispatch_compiler_barrier性能测试使用场景dispatch_once 能够保证代码块只执行一次,即使在多线程使用时。一般来说我们如果要保证代码只执行一次,就是进行加锁,通过修改一个变量值0 -> 1 来判断这段代码是否执行过。在iOS中dispatch_once经常被用来创造单例对象,或者进行方法交换swizzle method例如 ...原创 2020-04-07 20:58:45 · 800 阅读 · 0 评论 -
iOS开发-全量日志捕获CocoaLumberjack
文章目录前言ASL前言全量日志就是app的运行日志打印等等。有时候光凭Crash日志并不能找到并解决问题,如果有Crash时App的日志输出,则会事半功倍。CocoaLumberjack是OSX和iOS平台优秀的全量日志抓取第三方库。github链接ASL (Apple system logger)是苹果公司自己实现的一套输出日志的接口。ASL通过DDASLLogger.m文件,我们了...原创 2020-04-05 14:15:23 · 2027 阅读 · 0 评论 -
iOS开发-App电量消耗以及CPU占用
文章目录如何获取电量消耗UIDevice 获取IOKit电量分析如何获取电量消耗UIDevice 获取- (float)batteryValue { [UIDevice currentDevice].batteryMonitoringEnabled = YES; return [UIDevice currentDevice].batteryLevel;}这个值以0.05...原创 2020-04-04 12:19:58 · 846 阅读 · 0 评论 -
iOS开发-App应用崩溃卡顿分析
文章目录App崩溃问题可捕获的崩溃信息收集PLCrashReporter实现系统接口不可捕获的崩溃iOS后台模式Runloop 卡顿Watch DogApp达到单个App上限被杀死JetsamEvent 分析内存大小XNU获取内存限值task_info接口App崩溃问题app经常会遇见崩溃问题,比如下数据越界多线程操作同一指针,当指针为空时崩溃野指针问题KVO问题NSNotific...原创 2020-04-04 01:35:52 · 3781 阅读 · 0 评论 -
iOS开发-常见的崩溃信息
文章目录崩溃信息构成Exception信息常见的崩溃问题额外的诊断信息崩溃信息构成常见的崩溃日志的头部信息如下:Incident Identifier: B6FD1E8E-B39F-430B-ADDE-FC3A45ED368CCrashReporter Key: f04e68ec62d3c66057628c9ba9839e30d55937dcHardware Model: iPad6,8...原创 2020-03-27 10:23:04 · 2420 阅读 · 1 评论 -
iOS开发-dSYM文件
文章目录dSYMxcode的符号化解析每个架构的符号Bitcode相关定位你的dSYMBuild UUID对比恢复隐藏的符号表文件符号化解析操作命令dSYM根据 苹果官方文档,当编译器将源代码转为机械码时,会生成调试符号(debug symbols),通过这些符号可以将机械码映射回到源代码的位置,也就是我们常说的符号化解析。这些调试符号存储在二进制文件中,或者存储在相应的调试符号(dSYM)...原创 2020-03-26 01:01:32 · 1143 阅读 · 0 评论 -
iOS开发-代码分析工具之Infer
文章目录简介使用安装设置 PATH 变量使用简介https://fbinfer.com/docs/getting-startedInfer 是一个静态分析工具。Infer可以分析 Objective-C, Java 或者 C 代码,报告潜在的问题。任何人都可以使用 Infer 检测应用,这可以将那些严重的 bug 扼杀在发布之前,同时防止应用崩溃和性能低下关于Infer特性可以去 ht...原创 2020-03-22 19:52:37 · 2264 阅读 · 0 评论 -
iOS开发-代码分析工具之Clang Static Analyzer
文章目录简介使用方法简介Clang Static Analyzer是一款静态代码扫描工具,专门用于针对C,C++和Objective-C的程序进行分析。已经被Xcode集成,可以直接使用Xcode进行静态代码扫描分析,也可以单独在命令行下使用并提供html格式的输出报吿和xml格式的结果文件方便集成到Jenkins上进行展示。不过相对来说,csa对oc可用的检查器简直是少之又少,只有16条,而...原创 2020-03-22 18:50:15 · 925 阅读 · 0 评论 -
iOS开发-代码分析OCLint工具
文章目录简介OCLint可以发现的问题使用安装创建所需要的文件调用分析指令Pod等三方库的过滤简介OCLint是一个 静态代码分析 工具,通过检查C、c++和Objective-C 代码并寻找潜在的问题.OCLint 就是一个建立在 Clang 上的工具,能够发现代码中潜在的问题,可以用来提高质量和减少缺陷, 它目前支持C, C++, Objective-C语言OCLint可以发现的问题...原创 2020-03-22 17:47:02 · 426 阅读 · 0 评论 -
iOS开发-APP组件模块化的理解
文章目录模块化的意义模块化的粒度组件组件化方案MGJRouter 的路由映射CTMediator 中间者Category的编写模块化的意义当项目大到一定程度,开发人员也多,所有的代码都集中到一个仓库,提交修改都要等其他人提交完成不报错才能开始,非常麻烦。再者就是代码之间耦合严重,到处引用,穿插错综复杂,往往改变一个变脸,需要修改很多处代码,很容易出错。对于这种情况,就要进行架构整治,模块化...原创 2020-03-21 12:40:34 · 554 阅读 · 0 评论 -
iOS开发-如何使用Runtime在分类中添加一个weak属性
文章目录使用runtime给分类添加属性使用NSProxy使用runtime给分类添加属性- (HCPushSettingViewController*)HCParentController { return objc_getAssociatedObject(self, _cmd);}- (void)setHCParentController:(HCPushSettingView...原创 2020-03-17 11:29:21 · 648 阅读 · 0 评论 -
Mac录制iOS模拟器转为GIF
文章目录使用QuickTime录制屏幕PicGIF Lite使用QuickTime录制屏幕在启动台找到QuickTime Player选择录制区域然后生成了文件PicGIF Lite使用PicGIF Lite,mac商店上就有导入视频删除不需要的帧再右上角导出GIF结果如下:...原创 2020-03-16 21:04:42 · 220 阅读 · 0 评论 -
iOS开发-创建Cocoapods公有库记录
文章目录1.创建git仓库2.更新工程代码3.生成podspec配置文件4.lint5.注册CocoaPods6.检测是否注册成功7.推送到远程Pod仓库1.创建git仓库2.更新工程代码通过 git clone https://github.com/haocaihaocai/HCPushSettingViewController.git将git仓库拉下来,然后将我们的代码添加。git...原创 2020-03-16 18:51:32 · 354 阅读 · 0 评论 -
Runtime交换类方法和实例方法
对于runtime机制,SEL和IMP结构体成员方式存储在Method中对于一个Method,一个SEL对应一个IMP,objc_cache机制也是通过SEL来查找,通过method->method_name == sel判断,这里贴一段缓存查找的汇编语言解释。本文讲述Object-c Runtime Method Swizzling方法交换,类方法交换以及实例方法交换原创 2019-07-09 20:55:20 · 1515 阅读 · 1 评论 -
iOS开发-FDFullscreenPopGesture冲突导航栏无法隐藏
文章目录问题描述处理方法修改源码不修改源码问题描述FDFullscreenPopGesture是iOS平台上很方便使用左滑手势退出的三方库,在使用FDFullscreenPopGesture会出现与其他三方库冲突,导航栏隐藏不了,或者按钮都显示。看一遍源码了解其实现,解决这种冲突问题。处理方法修改源码源码是通过交换push方法实现,若想不影响某个视图,就直接调用原push方法就可以...原创 2020-03-10 17:36:17 · 1381 阅读 · 0 评论 -
iOS开发-水印视图的简单制作
文章目录使用CoreGraphic绘制效果代码如下使用CoreGraphic绘制NSAttributedString能够使用drawAtPoint方法绘制到文本上CGContextSaveGState通过Pop Push上下文堆栈,避免影响其他通过CGContextConcatCTM可以进行二维变换,进行倾斜30度CGAffineTransform transform = CGAff...原创 2020-03-30 19:09:54 · 825 阅读 · 0 评论 -
iOS开发-ViewController的生命周期相关
文章目录ViewController生命周期加载流程didReceiveMemoryWarningView的layoutSubviewsRunloop相关view的drawRect:方法ViewController生命周期加载流程1.init或者initWithCoder:(NSCoder *)aDecoder:(如果使用storyboard或者xib)2.loadView:加载view...原创 2020-03-03 14:12:29 · 354 阅读 · 1 评论 -
iOS开发-一个iOS覆盖面比较广面试题
文章目录题目Code 1崩溃原因Code 2不会崩溃的原因结尾题目在@property (nonatomic, strong) NSString *name;的情况下分别执行以下两段代码,会发生什么? //Code 1 dispatch_queue_t queue = dispatch_get_global_queue(0, 0); for (int i = 0; i < 1...原创 2020-02-28 17:01:25 · 453 阅读 · 0 评论