8 Ansel_m

尚未进行身份认证

阿里天猫

等级
TA的排名 768

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

fishhook源码解析

前言fishhook是fackbook开源的一个用来hook c函数的库。在iOS开发中我们一般都是对OC方法进行hook,这是因为OC的动态特性才能实现的,OC的方法调用是在运行时动态查找的。而c函数是静态,为什么同样能够hook呢?接来下就看看这其中用到了什么黑魔法!一、Mach-O文件首先,我们将iOS源代码打包后会生成一个.ipa文件,里面包含了一些资源文件以及可执行文件,这个...

2019-09-26 15:09:03

剖析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:04

获取任意线程调用栈的那些事

BSBacktraceLogger 是一个轻量级的框架,可以获取任意线程的调用栈,开源在我的GitHub,建议下载下来结合本文阅读。我们知道NSThread有一个类方法callstackSymbols可以获取调用栈,但是它输出的是当前线程的调用栈。在利用 Runloop 检测卡顿时,子线程检测到了主线程发生卡顿,需要通过主线程的调用栈来分析具体是哪个方法导致了阻塞,这时系统提供的方法...

2019-09-26 10:33:10

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

一种延迟 premain code 的方法

大量的premain代码,不可控,在线上随时都是炸弹。为了让开发者过渡的更“透明“,有了下面的方法。想法来源仍然是两年前的三篇分析Facebook客户端的文章:1- 探索 facebook iOS 客户端 - section fbsessiongkshttps://everettjf.github.io/2016/08/21/facebook-explore-section...

2019-08-13 10:45:15

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

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

最简单的启动任务分类

一个“有年头”的App,启动中要做的工作不断的累加,didFinishLaunchingWithOptions中的代码越来越长,AppDelegate.m文件的行数也越来越多。那么是时候分类存放了。App启动中的任务可以简单分为下面几类: 必须最早在主线程初始化的任务 可以子线程执行的任务 可以与2中的任务并行执行的主线程任务 可以在首页显示后子线程执行的任...

2019-08-13 10:40:53

线程标识获取方法

性能优化的开发中经常需要获取线程标识,这篇文章简单罗列和对比了四种获取线程标识的方法。四种方法这四种方法如下://<NSThread:0x283903000>{number=1,name=main}[[NSThreadcurrentThread]description]//0x283903000[NSThreadcurrentThread]...

2019-08-13 10:39:07

由「抖音二进制文件重排」想到的

2018年11月份,支付宝发布了一篇文章《支付宝 App 构建优化解析:通过安装包重排布优化 Android 端启动性能》,简单来说这篇文章说明、实践且验证了通过「安装包重排」可以加快Android应用的启动速度。而作为支付宝曾经的一员,很早就知道了这个方案,当时也在想iOS能否有类似的方案,很快找到了一篇“退休”的文档:Code Size Performance Guidelin...

2019-08-13 10:36:29

抖音研发实践:基于二进制文件重排的解决方案 APP启动速度提升超15%

背景启动是App给用户的第一印象,对用户体验至关重要。抖音的业务迭代迅速,如果放任不管,启动速度会一点点劣化。为此抖音iOS客户端团队做了大量优化工作,除了传统的修改业务代码方式,我们还做了些开拓性的探索,发现修改代码在二进制文件的布局可以提高启动性能,方案落地后在抖音上启动速度提高了约15%。本文从原理出发,介绍了我们是如何通过静态扫描和运行时trace找到启动时候调用的函数,然后修改编...

2019-08-13 10:33:14

iOS获取启动开始时间

/// 获得进程的信息+ (BOOL)processInfoWithPID:(int)pid proInfo:(struct kinfo_proc*)procInfo{ int cmd[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, pid}; size_t size = sizeof(*procInfo); retu...

2019-07-30 17:19:03

基于 clang 插件的一种 iOS 包大小瘦身方案

引子包瘦身,包瘦身,包瘦身,重要的事情说三遍。最近公司一款 iOS APP(本文只讨论使用 Objective C 开发的 iOS 安装包) 一直在瘦身,我们团队的 APP 也愈发庞大了。而要解决这个问题,思路主要集中在两个方向,资源和代码。资源主要在于图片,方法包括移除未被引用的图片,只使用一套图片 (2x 或 3x),图片伸缩等;代码层面主要思路包括重构消除冗余,linkmap 中 s...

2019-06-27 10:53:15

otool 分析Mach-O

otool 查看所有的Methodotool -v -s __TEXT __objc_methname mach-o的pathotool 查看被调用的Methodotool -v -s __DATA __objc_selrefs mach-o的pathotool 查看所有的Classotool -v -s __TEXT __objc_classname mac...

2019-06-18 15:24:58

iOS调优 | 深入理解Link Map File

Link Map File初识我们编写的源码需要经过编译、链接,最终生成一个可执行文件。在编译阶段,每个类会生成对应的.o文件(目标文件)。在链接阶段,会把.o文件和动态库链接在一起。Link Map File就是这样一个记录链接相关信息的纯文本文件,里面记录了可执行文件的路径、CPU架构、目标文件、符号等信息。为什么要理解Link Map File理解Link Map File,可以...

2019-06-18 10:57:12

分析Mach-O文件

OSX系统自带的otool可以分析Mach-O可执行文件类似命令行工具:jtool常用命令如下:查看fat headers信息otool -f xxx.app/xxx$ otool -f xxx.app/xxxFat headersfat_magic 0xcafebabenfat_arch 2architecture 0 cputype 12 cpusubt...

2019-06-18 10:25:06

创建CocoaPods的制作过程

使用CocoaPods来管理第三方库实在是方便,在学会了使用CocoaPods后,开始尝试创建一个自己的版本依赖库,当然,迟早要走到这一步的.创建仓库接下来实现一个首页广告循环播放功能,项目名为CLRollingCycleView本地仓库使用Xcode创建一个CLRollingCycleView项目,项目并添加Classes(核心功能)远程仓库在github上同样创建...

2019-05-08 16:20:14

BFTask剖析

github:https://github.com/BoltsFramework/Bolts-ObjC

2019-04-14 22:41:35

图文翔解HashTree

在各种数据结构(线性表、树等)中,记录在结构中的相对位置是随机的。因此在机构中查找记录的时需要进行一系列和关键字的比较。这一类的查找方法建立在“比较”的基础上。查找的效率依赖于查找过程中所进行的比较次数。之前我们介绍的各种基于比较的树查找算法,这些查找算法的效率都将随着数据记录数的增长而下降。仅仅是有的比较慢(时间复杂度为O(n)),有的比较快(时间复杂度是O(logn))而已。这些查找算法的...

2019-04-10 10:39:50

查看更多

勋章 我的勋章
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 1024勋章
    1024勋章
    #1024程序员节#活动勋章,当日发布原创博客即可获得
  • 勤写标兵Lv3
    勤写标兵Lv3
    授予每个自然周发布7篇到8篇原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。