8 Ansel_m

尚未进行身份认证

我要认证

阿里天猫

等级
TA的排名 835

BinarySearch

public int indexOf(int[] array, int data) { if (array == null || array.length == 0) { return -1; } int begin = 0; int end = array.length; while (begin < end) { int mid = (begin + ...

2020-05-14 15:36:48

Background Fetch

Background Fetch 是iOS7开始提供的一个数据拉取机制,主要是用于需要频繁更新内容的应用,例如社交、新闻或者天气应用。当实现了这个机制,系统会学习用户使用应用的习惯,并尽量在用户下次打开应用之前,给应用一个后台启动(或者叫后台唤醒)的机会,让应用提前可以准备数据。例如,如果用户总是在下午1点打开应用,那么系统会学习到这个习惯,并尽量在1点之前触发Background Fetc...

2020-04-29 11:49:27

地址变更

Significant Location Update当请求地理位置权限时,可以请求“后台定位”的权限,当有后台定位权限时,应用可以调用 CLLocationManager的startMonitoringSignificantLocationChanges方法启用“显著位置变化的监听”,当GPS位置有明显变化时(实际测试一般4、5百米),应用会在后台启动。首先,需要CLLocationMa...

2020-04-25 15:39:18

斐波那契数

//性能差 时间复杂度:2的n次方- (NSUInteger)fibonacci1:(NSUInteger)number { if (number <= 1) { return number; } return [self fibonacci1:number - 1] + + [self fibonacci1:number - ...

2020-04-25 00:28:00

获取线程堆栈剩余大小

#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

load和initialize方法的区别

一、调用方式1、load 是根据IMP直接调用2、initialize是通过objc_msgSend调用二、调用时刻1、load是runtime加载类、分类的时候调用(只调用一次)2、initialize类第一次接收消息的时候调用,每个类只会调用一次(父类可能被调用多次)三、调用顺序1.load 1)、先调用类的load a.、先编译的类...

2020-03-15 22:49:14

isa superclass的总结

如下图

2020-03-03 19:52:59

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

查看更多

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