![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Object-C
文章平均质量分 57
CaicaiNo.1
这个作者很懒,什么都没留下…
展开
-
iOS开发-NSThread子线程autoreleasepool的问题
前言对于 NSThread 开启的子线程,我们需要在 main 函数中创建一个autoreleasepool,当我们从其他线程跳转到该线程执行时,对象是如何释放的呢?主线程是由于runloop的循环,在beforeWait时,触发主线程的autoreleasepool的pop和push操作来释放的,而子线程并没有自动添加这些observer,那么如何释放的?探索跳转到我们线程执行任务的方法如下,使用了performSelector:系列的方法。OBJC_EXTERN void _objc_autor原创 2021-02-04 00:10:29 · 1334 阅读 · 1 评论 -
iOS开发 - OCLint的自定义规则编写
文章目录通过Xcode显示Warning方案的选择简易Rule编写brew安装Aggregate 添加脚本规则编写通过Xcode显示Warning方案的选择前面已经说过如何添加自定义的规则rule以及Xcode调试:iOS开发 - OCLint自定义规则的编译与Xcode调试一般来说,我们都有这样的需求:想在写代码的时候,就能分析出代码问题,并及时进行修改。虽然OCLint能够分析单个文件,但没有Xcode插件,像 Analyze 这样的实时分析可能并不好实现,这里我们就选择编译一次然后在项目中提示原创 2020-07-20 17:40:52 · 1581 阅读 · 0 评论 -
iOS开发 - NSHashTable与Runloop所造成的强引用问题
文章目录概述Runloop Observer的问题AutoreleasePool界面更新概述首先,我来描述一下这个问题,NSHashTable 是OC中用于弱引用对象的NSMutableSet 类型,在项目使用中,我们发现调用其 allObjects 方法会造成强引用关系,导致对象不会释放。具体情况如下:我们监听了主线程的 Runloop 并在 kCFRunLoopBeforeWaiting | kCFRunLoopExit 时触发,由于我们需要统计 UITableViewCell 的信息,所以我们将原创 2020-07-03 10:13:23 · 780 阅读 · 0 评论 -
iOS开发 - Runloop的mode是如何切换的
文章目录问题探索Runloop的mode是如何切换的mode切换时会退出吗?问题Runloop的mode是如何切换的?Runloop的mode切换时,上一个mode是需要退出吗?探索Runloop的mode是如何切换的UITableView滑动时,Runloop会进行切换mode,由kCFRunLoopDefaultMode切换为UITrackingRunLoopMode,根据源码,切换mode实际是调用CFRunLoopRunSpecific 这个函数SInt32 CFRunLoopRu原创 2020-07-01 15:12:13 · 1590 阅读 · 0 评论 -
iOS开发-NSMapTable NSHashTable NSPointerArray的使用
文章目录NSMapTableNSDictionary的局限性NSMapTable优势配置参数 OptionsMemory OptionARC下MRC下Personality optionsUsage快捷生成自定义配置NSHashTableNSHashTable 优势配置参数UsageNSPointerArrayNSPointerArray 特性创建Usage对于工程中使用的弱引用集合的特性进行整理,有些点还是容易忘记NSMapTable NSHashTable NSPointerArray 是iOS中用原创 2020-06-18 15:18:16 · 1949 阅读 · 0 评论 -
RAC中宏的使用-预编译确定函数参数个数
RAC中宏的使用-预编译确定函数参数个数对于RAC框架中的宏定义,预编译期确认参数个数/** * Returns the number of arguments (up to twenty) provided to the macro. At * least one argument must be provided. * * Inspired by P99: http://p99.gforge.inria.fr */#define metamacro_argcount(...) \原创 2020-06-09 20:34:11 · 402 阅读 · 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 评论 -
日常学习-关于GSIMap结构
文章目录数据结构解析数据结构最近研究NSNotification源码碰上了一个GSIMap结构体,发现其结构很有意思,即* A rough picture is include below: * * * This is the map C - array of the buckets * +---------------+ ...原创 2020-04-27 00:31:25 · 423 阅读 · 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开发-如何解决静态库的冲突问题
文章目录问题静态库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开发-关于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开发-全量日志捕获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应用崩溃卡顿分析
文章目录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开发-如何使用Runtime在分类中添加一个weak属性
文章目录使用runtime给分类添加属性使用NSProxy使用runtime给分类添加属性- (HCPushSettingViewController*)HCParentController { return objc_getAssociatedObject(self, _cmd);}- (void)setHCParentController:(HCPushSettingView...原创 2020-03-17 11:29:21 · 648 阅读 · 0 评论 -
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 评论 -
iOS开发-Runloop中自定义输入源Source
自定义输入源根据苹果官方文档说明,基于端口的源(Source1)由内核自动发出信号,定制源(Source0)必须从另一个线程手动发出信号定制源Source0创建custom input source需要定义以下内容:您希望输入源处理的信息。一个调度函数(scheduler),让感兴趣的客户端知道如何联系输入源。执行任何客户机发送的请求的处理函数(handler)。用于使输入源无效的...原创 2020-02-26 16:40:59 · 2504 阅读 · 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 评论 -
OC Runtime常用api
文章目录objc_xxx系列函数class_xxx 系列函数object_xxx 系列函数method_xxx 系列函数property_xxx 系列函数protocol_xxx 系列函数ivar_xxx 系列函数sel_xxx 系列函数imp_xxx 系列函数objc_xxx系列函数objc_系列函数关注于宏观使用,如类与协议的空间分配,注册,注销等操作// 函数名称 函数作用o...原创 2019-07-04 12:55:42 · 176 阅读 · 0 评论 -
OC中Runtime的类+load方法调用
文章目录load 方法的调用栈load_imagesprepare_load_methodsschedule_class_load 查找父类add_class_to_loadable_list 将类加入cls listadd_category_to_loadable_list 将分类加入cate listcall_load_methods 调用所有类和分类的+loadcall_class_load...原创 2019-07-15 12:49:39 · 613 阅读 · 0 评论 -
OC Runtime探索
runtime是什么?什么是运行时?OC对象和消息发送?给对象发送方法?给类发送消息?类的元类作用,以及它们之间的关系,runtime在oc中的应用,NSTagged Pointer是什么?原创 2019-07-06 19:16:09 · 666 阅读 · 1 评论 -
AutoreleasePool的原理
文章目录结构分析AutoreleasePoolPage创建函数pushpopreleaseUntil与runloop的关系与线程之间的关系内存管理中的自动释放池__weak修饰的关联Tips:利用_objc_autoreleasePoolPrint()可以查看注册到autoreleasepool的对象,方便我们调试。我们都知道自动释放池是一个栈结构,它的内存分配是从高地址向低地址分配。(与堆相...原创 2019-07-16 13:25:53 · 1529 阅读 · 0 评论 -
OC-对象释放线程管理
ARC模式下,对象会在引用计数器为0时释放,当我们想管理其释放线程时,就在子线程将其引用计数置为0class MyMutableArray : NSMutableArray { deinit { print("deinit \(Thread.current)") }}class ViewController: UIViewController { v...原创 2019-08-22 17:51:30 · 383 阅读 · 0 评论 -
OC笔记-CFBridgingRetain和CFBridgingRelease
在Core Foundation框架和Foundation框架中有大量的可互换使用的数据类型。这意味着你可以使用相同的数据类型,作为Core Foundation框架方法调用或Objective-C消息的参数或接收者。这种在Core Foundation框架和Foundation框架之间交换使用数据类型的技术就叫 Toll-Free Bridging。一般我们使用CFBridgingReta...原创 2019-09-11 16:27:51 · 1852 阅读 · 0 评论 -
Runtime消息转发机制forward
文章目录方法查找流程消息转发机制_class_resolveMethod方法查找流程我们知道当查找一个方法时,会通过isa指针,从其类中查找,类中没有,则从类的父类查找,当root的类没有这个方法时,就进入了我们的动态解析机制,消息转发。通过观察lookUpImpOrForward的实现,我们同样可以证实,方法的查询逻辑为对象中没有,就从父类中查找,执行顺序为:// Try this c...原创 2019-07-09 00:50:10 · 337 阅读 · 0 评论