![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
iOS底层
文章平均质量分 52
Ansel_m
阿里天猫
展开
-
iOS获取进程创建的时间
iOS获取进程创建的时间原创 2022-06-28 16:27:16 · 439 阅读 · 1 评论 -
runtime深入解析
1.前言OC是一门动态性比较强的编程语言,允许很多操作推迟到程序运行时再进行, 而OC的动态性是由Runtime来支撑和实现的,Runtime是一套C语言的API,封装了很多动态性相关的函数,平时编写的OC代码,底层都是转换成了Runtime API进行调用。2. 基础知识2.1 Class2.2 Meta Calss2.3 Ivar2.4 Property2.5 Method2.6 Category /关联2.7 super2.三个阶段2.1.消息发送2.2.动态方法解析2原创 2022-03-28 21:45:09 · 1033 阅读 · 0 评论 -
Block底层详解
block详解1.前言2.block的类型2.1.总共三种类型,具体如下:2.2 __ NSGlobalBlock__2、block数据结构3、block的变量捕获(capture)2.1auto变量的捕获2.2对象类型的auto变量4、block的Copy5、__weak问题解决6、__block修饰符6.1使用6.2内存管理6.3__forwarding指针7、循环引用1.前言本文旨在对block底层进行详细的探究,源码参考libclosure-79。2.block的类型2.1.总共三种类型,原创 2022-03-08 22:36:04 · 2839 阅读 · 0 评论 -
简单获取class的方式
- (void)initMainBundleClasses { NSMutableArray<NSString *> *mainBundleClasses = @[].mutableCopy; unsigned int classCount = 0; const char** classNames = objc_copyClassNamesForImage([[NSBundle mainBundle] executablePath].UTF8String, &...原创 2021-04-15 13:18:25 · 173 阅读 · 1 评论 -
获取线程堆栈剩余大小
#import <pthread.h>pthread_t currentThread = pthread_self();uint8_t *endStack = pthread_get_stackaddr_np(currentThread);size_t totalStackSize = pthread_get_stacksize_np(currentThread);u...原创 2020-04-04 00:41:51 · 1569 阅读 · 0 评论 -
isa superclass的总结
如下图原创 2020-03-03 19:52:59 · 140 阅读 · 0 评论 -
isa的地址
struct NSObject_IMPL { void *isa;};NSObject *object = [[NSObject alloc] init];struct NSObject_IMPL *obj = (__bridge struct NSObject_IMPL *)object;NSLog(@"%p, %p", &obj->isa, object...原创 2020-02-25 22:31:57 · 258 阅读 · 0 评论 -
剖析ARM64下的objc_msgSend
本文来自Mad_Mark的简书,作者 sasukeo原文原文:Dissecting objc_msgSend on ARM64原文作者:Mike Ash本文结合原文评论区Greg Parker的评论略做修改。建议结合objc_msgSend源码来阅读本文。在了解objc_msgSend的原理的同时,也可作为ARM64汇编的入门。概述每一个OC对象有一个类,每一个OC...转载 2019-09-30 17:39:11 · 1014 阅读 · 0 评论 -
Objective-C Autorelease Pool 的实现原理
内存管理一直是学习 Objective-C 的重点和难点之一,尽管现在已经是 ARC 时代了,但是了解 Objective-C 的内存管理机制仍然是十分必要的。其中,弄清楚 autorelease 的原理更是重中之重,只有理解了 autorelease 的原理,我们才算是真正了解了 Objective-C 的内存管理机制。注:本文使用的 runtime 源码是当前的最新版本 objc4-646.t...转载 2018-07-12 16:05:09 · 151 阅读 · 0 评论 -
iOS super关键字帮我们做了什么?
×iOS super关键字帮我们做了什么?本篇文章讲的是super的实际运作原理,如有同学对super与self的区分还有疑惑的,请参考ChenYilong大神的《招聘一个靠谱的iOS》面试题参考答案(上)。super究竟在干什么?官方提到的super关键字?打开苹果API文档,搜索objc_msgSendSuper(对该函数陌生的先去补补rumtime转载 2018-01-08 22:11:33 · 244 阅读 · 0 评论 -
获取任意线程调用栈的那些事
BSBacktraceLogger 是一个轻量级的框架,可以获取任意线程的调用栈,开源在我的GitHub,建议下载下来结合本文阅读。我们知道NSThread有一个类方法callstackSymbols可以获取调用栈,但是它输出的是当前线程的调用栈。在利用 Runloop 检测卡顿时,子线程检测到了主线程发生卡顿,需要通过主线程的调用栈来分析具体是哪个方法导致了阻塞,这时系统提供的方法...转载 2019-09-26 10:34:18 · 551 阅读 · 0 评论 -
Hook static initializers
先补充:标题中 static initializers 其实应该叫做C++ static initializers and C/C++ __attribute__(constructor) functions。使用 MachOView 打开一个MachO文件,多数情况下会看到这个section__mod_init_func。这个section的用途是什么呢?从名字大概猜测...转载 2019-08-13 10:46:33 · 706 阅读 · 2 评论 -
一种延迟 premain code 的方法
大量的premain代码,不可控,在线上随时都是炸弹。为了让开发者过渡的更“透明“,有了下面的方法。想法来源仍然是两年前的三篇分析Facebook客户端的文章:1- 探索 facebook iOS 客户端 - section fbsessiongkshttps://everettjf.github.io/2016/08/21/facebook-explore-section...转载 2019-08-13 10:45:15 · 427 阅读 · 0 评论 -
关于 @synchronized,这儿比你想知道的还要多
本文翻译自 Ryan Kaplan 的 More than you want to know about @synchronized因为原文一些内容写的不太准确,我按照我的理解做出了批注和补充。如果你已经使用 Objective-C 编写过任何并发程序,那么想必是见过 @synchronized 这货了。@synchronized 结构所做的事情跟锁(lock)类似:它防止不同的线转载 2018-01-29 21:52:35 · 171 阅读 · 0 评论 -
遍历自身加载的dylib--获取载入地址和ASLR地址等
for (int i = 0; i _dyld_image_count(); i++) { char *image_name = (char *)_dyld_get_image_name(i); const struct mach_header *mh = _dyld_get_image_header(i); intptr_t vmaddr_sli转载 2018-01-29 15:02:08 · 1384 阅读 · 0 评论 -
深入理解Objective-C:Category
摘要无论一个类设计的多么完美,在未来的需求演进中,都有可能会碰到一些无法预测的情况。那怎么扩展已有的类呢?一般而言,继承和组合是不错的选择。但是在Objective-C 2.0中,又提供了category这个语言特性,可以动态地为已有类添加新行为。如今category已经遍布于Objective-C代码的各个角落,从Apple官方的framework到各个开源框架,从功能繁复的大型APP到转载 2018-01-10 14:27:07 · 141 阅读 · 0 评论 -
iOS微信安装包瘦身
前提微信经过多次版本迭代,产生不少冗余代码和无用资源。之前微信也没有很好的手段知道哪个模块增量多少。另外去年10月微信开始做ARC支持,目的是为了减少野指针带来的Crash,但代价是可执行文件增大20%左右。而苹果规定今年6月提交给Appstore的应用必须支持64位,32位和64位两个架构的存在使得可执行文件增加了一倍多。安装包大小优化迫在眉睫。Appstore安装包是由资源转载 2018-02-02 11:44:17 · 909 阅读 · 0 评论 -
EXC_BAD_ACCESS异常 _block_invoke 问题
我们在调用block时,如果这个block为nil,则程序会崩溃,报类似于EXC_BAD_ACCESS(code=1, address=0xc)异常【32位下的结果,如果是64位,则address=0x10】。如图1,这个异常表示程序在试图读取内存地址0xc的信息时出错。在定义一个block时,编译器会在栈上创建一个结构体,类似于图2的结构体。 block就是指向这个结转载 2018-01-12 16:48:56 · 3681 阅读 · 0 评论 -
iOS中检测Zombie对象的具体实现
我们知道,如果在XCode中开启了Zombie Objects。如图。那么在一个对象释放后,再次给该对象发送消息,在Xcode控制台中,可看到如下打印信息。这些信息可以帮助我们定位问题。ZoombieDemo[12275:2841478]***-[Testtest]:messagesenttodeallocatedinstance0x60800000b000那么...转载 2018-01-12 16:32:40 · 998 阅读 · 0 评论 -
FBRetainCycleDetector源码分析
概述FBRetainCycleDetector是facebook开源的一个用来检测对象是否有强引用循环的静态库。strong和weakstrong和weak在声明中使用表示这是一个强引用还是弱引用对象。强引用:只要引用存在,对象就不能被销毁。弱引用:弱引用不会导致对象不能销毁,只要没有强引用了,对象就会销毁,对象销毁后,弱引用会自动设置为nil。当一个对象不再有strong转载 2017-12-07 23:17:34 · 1976 阅读 · 0 评论 -
Friday Q&A : 动手实现 objc_msgSend
作者 Mike Ash原文地址objc_msgSend 函数支撑了我们使用 Objective-C 实现的一切。Gwynne Raskind,Friday Q&A 的读者,建议我谈谈 objc_msgSend 的内部实现。要理解某件事还有比自己动手实现一次更好的方法吗?咱们来自己动手实现一个 objc_msgSend。Tramapoline! Trampopoline!转载 2017-12-07 15:42:05 · 240 阅读 · 0 评论 -
正确使用多线程同步锁@synchronized()
在上篇多线程安全的文章中,我曾推荐过大家使用@synchronized来使得代码获得原子性,从而保证多线程安全。这篇文章向大家介绍一些@synchronized的知识点和应该避免的坑。@synchronized原理@synchronized是几种iOS多线程同步机制中最慢的一个,同时也是最方便的一个。苹果建立@synchronized的初衷就是方便开发者快速的实现代码同步,转载 2018-01-30 10:38:00 · 691 阅读 · 0 评论 -
iOS监听weak属性
一.KVO特点 观察者观察的是属性,只有遵循 KVO 变更属性值的方式才会执行KVO的回调方法,例如是否执行了setter方法、或者是否使用了KVC赋值。如果赋值没有通过setter方法或者KVC,而是直接修改属性对应的成员变量,例如:仅调用_name = @"Ansel",这时是不会触发kvo机制,更加不会调用回调方法的。所以使用KVO机制的前提是遵循 KVO转载 2018-01-30 11:35:02 · 883 阅读 · 0 评论 -
mmap
mmap是性能优化的必备神器,这篇文章简单罗列下相关信息。mmap是什么简单通俗不精确的说,mmap可以直接建立内存与文件的映射,进程对内存的修改可直接同步到文件内容的修改,仅有一次磁盘到内存的拷贝过程。这是Wikipedia的解释:In computing, mmap(2) is a POSIX-compliant Unix system call that maps file...转载 2019-08-13 10:44:05 · 588 阅读 · 0 评论 -
Hook所有+load方法(包括Category)
大概两年前刚开始做性能优化工作,为了Hook所有+load方法,是用Hopper先列出所有+load,然后使用CaptainHook在动态库中逐个指定类名来Hook每一个+load方法。写了一篇文章,先后发表到了内网(ATA)和博客,博客文章地址是: https://everettjf.github.io/2017/01/06/a-method-of-hook-objective-c-load/ ...转载 2019-08-13 10:42:20 · 2112 阅读 · 0 评论 -
线程标识获取方法
性能优化的开发中经常需要获取线程标识,这篇文章简单罗列和对比了四种获取线程标识的方法。四种方法这四种方法如下://<NSThread:0x283903000>{number=1,name=main}[[NSThreadcurrentThread]description]//0x283903000[NSThreadcurrentThread]...转载 2019-08-13 10:39:07 · 500 阅读 · 0 评论 -
基于 clang 插件的一种 iOS 包大小瘦身方案
引子包瘦身,包瘦身,包瘦身,重要的事情说三遍。最近公司一款 iOS APP(本文只讨论使用 Objective C 开发的 iOS 安装包) 一直在瘦身,我们团队的 APP 也愈发庞大了。而要解决这个问题,思路主要集中在两个方向,资源和代码。资源主要在于图片,方法包括移除未被引用的图片,只使用一套图片 (2x 或 3x),图片伸缩等;代码层面主要思路包括重构消除冗余,linkmap 中 s...转载 2019-06-27 10:53:15 · 530 阅读 · 0 评论 -
黑幕背后的Autorelease
我是前言Autorelease机制是iOS开发者管理对象内存的好伙伴,MRC中,调用[obj autorelease]来延迟内存的释放是一件简单自然的事,ARC下,我们甚至可以完全不知道Autorelease就能管理好内存。而在这背后,objc和编译器都帮我们做了哪些事呢,它们是如何协作来正确管理内存的呢?刨根问底,一起来探究下黑幕背后的Autorelease机制。Autorelease对象什么时...转载 2018-07-12 14:21:16 · 229 阅读 · 0 评论 -
【iOS 应用瘦身】使用 Clang 插件扫描无用代码(Part3)
前言经过前两篇文章的尝试,我们已经成功的实现了一个无用代码检查插件。但是一个成熟的项目,其中的代码复杂度远比前文的 Demo 要高得多,要想真正在项目工程中运行插件,检查无用代码,还有许多坑要踩。本篇文章中,我将分享自己在从 Demo -> 实际项目的适配过程中所遇到的问题一些问题。那些未被考虑的情况多文件的意义上篇文章中我曾提到过,Clang AST 是以单个文件为扫描单位的,那么 Cla...转载 2018-02-24 17:56:27 · 879 阅读 · 0 评论 -
【iOS 应用瘦身】使用 Clang 插件扫描无用代码(Part2)
前言在上一篇文章中,我们了解了 AST 树的结构,并简单的实现了一个 RecursiveASTVisitor 子类,成功的访问了语法树上的各个节点。回头再看看一下前文的代码,结合官方文档,我们可以大致整理出如下调用逻辑:Clang 对 AST 树的解析是以单个文件为单位的,这点我们从 ast-dump 的命令也可以看出来,这也注定了使用 Clang AST 静态分析,是无法完整分析整个项目中的调用...转载 2018-02-24 17:55:44 · 986 阅读 · 0 评论 -
【iOS 应用瘦身】使用 Clang 插件扫描无用代码(Part1)
前言最近组里的项目遇到了一个瓶颈问题:代码段超标,简单的说,就是编译后输出的可执行文件太大了,来看看 官方文档 中的相关规定:For iOS and tvOS apps, check that your app size fits within the App Store requirements.Your app’s total uncompressed size must be less th...转载 2018-02-24 17:54:56 · 3275 阅读 · 0 评论 -
当我们谈论iOS瘦身的时候,我们到底在谈论些什么
不断的开发迭代,产品经理不断的添加需求,引入的资源文件几乎是只加不减,猛然回首,iOS包已经100多m,看来iOS瘦身迫在眉睫啊!!!!iOS瘦身的好处我们先来讨论 iOS瘦身的好处,正所谓知其然知其所以然。iOS瘦身有哪些好处?1. However, consider download times when determining your app’s size. Minimize the fi...转载 2018-02-24 15:21:39 · 376 阅读 · 0 评论 -
如何在 iOS 中解决循环引用的问题
稍有常识的人都知道在 iOS 开发时,我们经常会遇到循环引用的问题,比如两个强指针相互引用,但是这种简单的情况作为稍有经验的开发者都会轻松地查找出来。但是遇到下面这样的情况,如果只看其实现代码,也很难仅仅凭借肉眼上的观察以及简单的推理就能分析出其中存在的循环引用问题,更何况真实情况往往比这复杂的多:testObject1.object = testObject2;testObject转载 2017-12-08 15:06:46 · 862 阅读 · 0 评论