自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(67)
  • 收藏
  • 关注

转载 iOS性能优化实践:头条抖音如何实现OOM崩溃率下降50%+

iOS OOM 崩溃在生产环境中的归因一直是困扰业界已久的疑难问题,字节跳动旗下的头条、抖音等产品也面临同样的问题。在字节跳动性能与稳定性保障团队的研发实践中,我们自研了一款基于内存快照技术并且可应用于生产环境中的 OOM 归因方案——线上 Memory Graph。基于此方案,3 个月内头条抖音 OOM 崩溃率下降 50%+。本文主要分享下该解决方案的技术背景,技术原理以及使用方式,旨在为这个疑难问题提供一种新的解决思路。OOM 崩溃背景介绍OOMOOM 其实是Out Of Memor.

2020-10-19 11:42:13 1254 1

原创 iOS实时卡顿检测-RunLoop(附实例)

前言在移动设备上开发软件,性能一直是我们最为关心的话题之一,我们作为程序员除了需要努力提高代码质量之外,及时发现和监控软件中那些造成性能低下的”罪魁祸首”也是我们神圣的职责。众所周知,iOS平台因为UIKit本身的特性,需要将所有的UI操作都放在主线程执行,所以也造成不少程序员都习惯将一些线程安全性不确定的逻辑,以及其它线程结束后的汇总工作等等放到了主线,所以主线程中包含的这些大量计算、IO、绘制都有可能造成卡顿。在Xcode中已经集成了非常方便的调试工具Instruments,它可以帮助我们在

2020-08-03 10:48:55 1187

原创 iOS 线上app性能检测 内存、CPU、FPS

App 的性能问题虽然不会导致 App不可用,但依然会影响到用户体验。如果这个性能问题不断累积,达到临界点以后,问题就会爆发出来。这时,影响到的就不仅仅是用户了,还有负责App开发的你。线下性能监控其中线下监控使用的还是Instruments,Instruments功能很强大,下图是Instruments的各种性能检测工具。Instruments性能检测.png最新版本的Instruments 10还有以下两大优势:1.Instruments基于os_signpost 架构,可.

2020-07-27 10:44:12 1436

原创 OpenGL - Mac环境搭建

首先我们需要准备资源:CLTools glew libGLTools.a在我的百度云盘里,大家可以直接下载下面开始配置openGL环境打开xcode,新建一个macOS项目,选择App,然后下一步。添加OpenGl.framework和GLUT.framework 两个系统库,如下图:搜索添加即可,添加CLTools.h,glew.h,直接把刚刚下载的文件拖入工程中即可(include,libGLTools.a),选择copy,然后删除AppDeleg.

2020-07-03 10:49:06 863 1

原创 Dart中的异步编程——Future、async和await

首先Dart是一门单线程的语言,那么Dart对异步操作对支持,可以使我们在编写Dart程序时可以异步的来执行耗时操作。从而可以在等待一个操作完成的同时进行别的操作以下是一些常见的异步操作: 通过网络获取数据。 写入数据库。 从文件读取数据。 要在Dart中执行异步操作,可以使用Future类和async和await关键字。#Dart的事件循环(event loop)在Dart中,实际上有两种队列: 事件队列(event queue),包含所有的外来事件:I..

2020-06-09 11:11:31 2144 1

原创 iOS野指针定位总结

野指针就是指向一个已删除的对象或者受限内存区域的指针。我们写C++的时候强调指针初始化为NULL,强调用完后也为其赋值为NULL,谁分配的谁回收,来避免野指针的问题。比较常见的就是这个指针指向的内存,在别处被回收了,但是这个指针不知道,依然还指向这块内存。MRC 时代因为引用计数手动控制,所以内存很容易在别处被回收。ARC解决了大部分这种问题。、在iOS9之前,系统库的delegate和t...

2020-04-30 18:36:26 984

原创 iOS开发 遍历字符串中所有子字符串的位置信息 并改变颜色

我们正常用的rangeOfString这个API找到第一个符合要求的字符串就直接返回了,当我们要改变所有符合要求的字符串颜色是就不行了,那么我们就找到一个然后截取掉,一直找到最后,把所有的位置用一个数组记录一下,思路很简单,记下来方便以后直接用! NSString *content = @"qwertyuiqwertyuiqwertyui"; NSString *sub= @"...

2020-04-10 15:36:47 474

原创 iOS中Category的底层实现原理

1. Category的使用场景Category也叫分类或类别,是OC提供的一种扩展类的方式。不管是自定义的类还是系统的类,我们都可以通过Category给原有类扩展方法(实例方法和类方法都可以),而且扩展的方法和原有的方法的调用方式是一模一样的。比如我项目中经常需要统计一个字符串中字母的个数,但是系统没有提供这个方法,那我们就可以用Category给NSString类扩展一个方法,然后只需引...

2020-04-01 16:17:58 955

原创 程序员必会的十大编程算法

算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。算法中的指令描述的是一个...

2020-03-28 16:32:01 967

原创 iOS runloop解决App crash并获取日志

App闪退一直是大家头疼的问题,尤其是未知的没有办法很好的做容错处理,今天就结合runloop处理崩溃问题效果实现:用法:1.将截图的中CatchedHelper文件夹拖到你的项目工程中。2.在AppDelegate.m中找到以下方法并如下添加代码:- (BOOL)application:(UIApplication *)application didFin...

2020-03-19 14:54:34 1090

原创 iOS Runtime中如何通过SEL找到IMP

objc_msgSend(id self, SEL _cmd, ...) 中SEL找到IMP的流程以下是苹果开源代码中Runtime底层的部分删减后的汇编代码ENTRY _objc_msgSend ldr x13, [x0] // x13 = isa and x16, x13, #ISA_MASK // x16 = class cmp x0, #0 ...

2020-03-16 15:30:02 1124

原创 dyld加载应用启动原理详解

我们都知道APP的入口函数是main(),而在main()函数调用之前,APP的加载过程是怎样的呢?接下来我们一起来分析APP的加载流程。一、利用断点进行追踪 首先我们创建一个工程,什么代码都不写,在main()函数处进行断点,会看到情况如下图: 01 通过上图我们可以看到,在调用堆栈中,我们只看到了star和main,并开启了主线程,其它的什么都看不到。那要怎么才能...

2020-03-08 21:08:24 802

原创 iOS逆向 class-dump导出 app machO里的头文件

class-dump简单介绍 如何使用class-dump一 class-dump简单介绍class-dump是可以把Objective-C运行时的声明的信息导出来的工具。实质就是可以导出.h文件。用class-dump可以把未经加密的app的头文件导出来官方网站:http://stevenygard.com/projects/class-dump/class-dump是一个ma...

2020-03-03 00:23:11 1252

原创 iOS逆向工具-yololib注入framework

一.yololib是干啥的?yololib可以给mach-o文件注入framework可以使用machOView软件查看注入的framework二.使用从github下载项目,编译得到yololib可执行文件. 将yololib复制到/usr/local/bin. 将ipa解压得到Payload,将从xcode生成的lyk.framework(一定要用真机编译)复制到W...

2020-02-21 12:44:09 2278

原创 shell脚本实现iOS包重签名及代码注入

当我们要逆向第三方应用时,首先就是要将应用安装在我们的手机上,然后进行hook分析,找到对应的方法调用,进行代码注入,破解其正常流程,从而达到逆向目的。接下来将详细讲解分析该过程具体实现。一、shell脚本实现重签名1. 我们以最常见的应用微信为例,其他应用原理一样!首先我们去PP助手下载越狱版本的微信应用,如下图:01 1.1 越狱版本的应用是没有加密的,正式版本的应用是加...

2020-02-20 18:59:14 452

原创 iOS block的深度探究

tags: block分两部分内容来剖析block:怎么用 为什么这么用block的堆栈分类:根据Block在内存中的位置分为三种类型NSGlobalBlock,NSStackBlock, NSMallocBlock。NSGlobalBlock:类似函数,位于text段; NSStackBlock:位于栈内存,函数返回后Block将无效; NSMallocBlock:位于堆...

2020-02-18 19:17:55 212

原创 iOS安全—防注入hook api “-Wl,-sectcreate,__RESTRICT,__restrict,/dev/null”

通过在 Xcode 里的 Other Linker Flags 设置参数,可以防止App被注入dylib(仅限于除iOS 10之外系统,) 比如,某艺,XX音乐等dylib无法注入,也就意味着没办法用cycript动态调试App,只能干瞪眼 1 -Wl,-sectcreate,__RESTRICT,__restrict,/dev/null ...

2020-02-17 14:47:40 2350 1

原创 iOS 类和元类的关系

事情的始末是这样的,同学想验证一下resolveClassMethod是否执行(resolveClassMethod是一个对象调用一个不存在类方法时,会执行此方法,不懂的要恶补一下了,可以看我这篇文章:Objective-C消息转发),然后发来了如下代码:[NSObject performSelector:@selector(hehe)];当时看完之后产生了疑惑,performSele......

2020-02-11 11:33:58 1496 2

原创 2019年中国互联网企业100强

2019年8月14日,在2019年中国互联网企业100强发布会暨百强企业高峰论坛上,《2019年中国互联网企业100强发展报告》、2019年中国互联网企业100强榜单正式发布。阿里巴巴(中国)有限公司、深圳市腾讯计算机系统有限责任公司、百度公司、京东集团、浙江蚂蚁小微金融服务集团股份有限公司、网易集团、美团点评、北京字节跳动科技有限公司、三六零安全科技股份有限公司、新浪公司位列榜单前十名。...

2020-01-02 11:35:24 6290 1

原创 Axure 9.0 Mac

Mac系统升级之后发现Axure8.0不能用了,今天找了好久找到9.0的了,记录一下方便大家学习使用,禁止其他用途!安装包及汉化包下载链接:https://pan.baidu.com/s/1VXTyzELBCCdz6-tMym_1OQ 密码:mx49汉化包使用方法1、将汉化压缩包解压缩。2、将解压缩后的lang文件夹和dll文件全部复制粘贴到软件安装根目录下。Mac系...

2019-12-31 15:48:29 2794 6

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

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

2019-12-18 14:46:15 460

原创 Runtime 与 Aspects

Runtime 之 isa指针111.png1.横向看:实例是对象,类也是对象(类对象),meta类也是对象(原类对象)这是很重要的一点,希望大家理解,我们这里忽略上下结构,先看左右结构,从左到右的指向就是之前介绍的runtime源码中objc_class结构里isa的指向,Instance指的是我们创建的对象,Subclass(class)就是创建该对象的那个类,注意:创建对象的...

2019-11-29 16:48:08 182

原创 iOS AOP框架Aspects实现原理

前言众所周知,Aspects框架运用了AOP(面向切面编程)的思想,这里解释下AOP的思想:AOP是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。也许大家用Aspects提供的两个方法用着很爽,有没有想揭开它的神秘面纱,看一下它的庐山真面目?接下来主要讲下Aspects的主要实现原理。ruhua.gif...

2019-11-27 16:03:28 277

原创 TableHeaderView 高度的问题

今天用xib 添加tableheaderview 自适应高度效果出来 发现高度一直不对 会有一些空白在下边找了各种办法 解决不了.无奈biadu看到有网友说 需要重新设置 tableheaderview 还是解决不了最后找到一种 办法主要是xib创建的view 才会有这种问题 代码创建没有问题解决办法: 可以先用代码新建一个view ...

2019-10-29 16:00:03 785

原创 iOS 13 适配 ING...

Xcode11 缺失库文件导入位置变更libstdc-6.0.9 文件下载Xcode11下 这个目录不存在了/Applications/Xcode-beta.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/CoreSimulator/Profiles/Runtimes/iOS.simruntim...

2019-10-17 10:09:54 1230

原创 iOS 13 适配要点总结

iOS 13 支持适配的机型iPhone X、iPhone XR、iPhone XS、iPhone XS Max iPhone 8、iPhone 8 Plus iPhone 7、iPhone 7 Plus iPhone 6s、iPhone 6s Plus iPhone SE iPod touch (第七代)新特性适配1. Dark ModeiOS 13 推出暗黑模式,UIK...

2019-09-24 14:37:48 968 1

原创 iOS 13新特性 适配

1.私有KVC[self setValue:baseTabBar forKey:@"tabBar"]; //正常[_textField setValue:[UIColor redColor] forKeyPath:@"_placeholderLabel.textColor"];///崩溃[_textField setValue:[UIFont systemFontOfSize:14] ...

2019-09-12 16:40:08 1527

原创 CocoaPods 出现 Unable to find a pod with name, author, summary, or description matching

今天在用CocoaPods搜索时,发现如下报错[!] Unable to find a pod with name, author, summary, or description matching `AF`执行 pod setup 其实在你安装 CocoaPods 执行 pod install 时,系统会默认操作 pod setup ,然而由于墙可能会 pod setup 不成...

2019-08-26 16:18:03 12231 1

原创 iOS 多线程:『GCD』详尽总结

为了更好的让大家了解 iOS 多线程,以及 GCD 的相关知识,我第三次对这篇文章进行了梳理,修改了 GCD 不同组合方式区别的相关总结,以及 队列、任务以及线程之间关系的形象理解。本文用来介绍 iOS 多线程中 GCD 的相关知识以及使用方法。这大概是史上最详细、清晰的关于 GCD 的详细讲解 + 总结 的文章了。通过本文,您将了解到:1. GCD 简介2. GCD 任务和队列3. G...

2019-08-23 17:46:14 286

原创 iOS开发 runtime一键更换字体 -UILabel,UIFont更换字体(全部更换为三方字体)

最近在项目中,被要求将系统的苹方体全部更换为三方字体,其实更换全部字体相对比更换部分字体来的简单,我们可以使用runtime来解决.将字体添加到项目中添加到项目中 将字体拖入系统resource中, 注意选择add to taget选项 add to target 打开Target 的Build Phases --> Copy Bundle R...

2019-08-20 17:47:12 493

原创 -bash: pod: command not found 解决以及CocoaPods安装中的碰到的坑

Pods很久没用, pod报错 -bash: pod: command not found CocoaPods不能用了遇到很多坑,记录下。1,先卸载原有的CocoaPod,sudo gem uninstall cocoapods2.重新安装cocoapod, 输入命令 sudo gem install -n /usr/local/bin cocoapods(10.11之前命令 ...

2019-08-20 09:48:44 2583

原创 iOS中block块的存储位置&内存管理

一、前言:Block是Objective-C中的一项强大的特性,Block可以看作是OC中对于闭包函数的实现,实质上Block也是一个对象~二、内存分配区域:OC中的各个主要的内存分配区域:包括有--栈区、堆区、常量区、全局静态区、文本区(代码区)内存分配区域栈区:存放函数参数值、局部变量、函数返回地址等,我们每次调用函数,都会执行压栈操作(在XCode的左侧...

2019-08-16 14:33:53 136

原创 iOS 中 weak 的实现原理

weak底层千千万,吾竟装作看不见...weak基本用法weak是弱引用,用weak描述修饰或者所引用对象的计数器不会加一,并且会在引用的对象被释放的时候自动被设置为nil,大大避免了野指针访问坏内存引起崩溃的情况,另外weak还可以用于解决循环引用。weak原理概括weak表其实是一个hash(哈希)表,Key是所指对象的地址,Value是weak指针的地址数组。weak的...

2019-08-14 11:53:56 222

原创 2019 全网 iOS 面试题以及答案总结!

一、Runtime一个objc对象的isa的指针指向什么?有什么作用? 一个 NSObject 对象占用多少内存空间? 说一下对 class_rw_t 的理解? 说一下对 class_ro_t 的理解? 说一下对 isa 指针的理解 说一下 Runtime 的方法缓存?存储的形式、数据结构以及查找的过程? 使用runtime Associate方法关联的对象,需要在主对象deall...

2019-08-08 10:03:48 5028

原创 苹果开发者账号申请流程完整版

苹果开发者账号申请文档一、苹果ID的注册1.注册苹果ID:https://appleid.apple.com/account#!&page=createo 国籍选好中国,避免后面开发者账号注册的时候带来不必要的麻烦(虽然不知道具体有什么麻烦)o 年龄一定要满18岁,这个也会是后面注册开发者账号失败的原因。二、开发者账号的注册1.登录个人账号页面点击 jo...

2019-08-01 16:09:53 2122

原创 iOS Class 使用NSProxy和NSObject设计代理类的差异

经常发现在一些需要使用消息转发而创建代理类时, 不同的程序员都有着不同的使用方法, 有些采用继承于NSObject, 而有一些采用继承自NSProxy. 二者都是Foundation框架中的基类, 并且都实现了<NSObject>这个接口, 从命名和文档中看NSProxy天生就是用来干这个事情的. 但即便如此, 它们却都定义了相同的消息转发的接口, 那我们在使用二者来完成这个工作时有什...

2019-08-01 11:38:01 283

原创 iOS 中的runtime与消息转发

在80年代初,小李和小王是异地恋的情侣,小王在改革号角的引领下毅然选择了南方的一个城市去奋斗,而那个时候没有手机,他们之间的互诉相思的方式主要依靠写信。但是由于小王又经常出差,居住地址会经常变动。所以小李每次给小王的回信,小王可能因为地址的变动而没有收到,他们后来想到了一个好办法来解决这个问题,具体的方法如下:80年代的消息转发其实上面这张图,基本上就可以表达Runtime在iO...

2019-07-31 17:45:31 147

原创 iOS重签名 砸壳,微信多开

App Store的包,是被加壳加密的,重签前需要先解密拆壳 (itunes 12.6.3 可以下载正版App ipa包, 文章最后有链接) 解密方式,一般从真机运行时,内存里 dump 出解密的包 查看app可执行文件,是否被加密,用 otool -l weChat|grep cryptid cryptid 0 //0没加密, 1 加密方式1, 2加密方式2 查看签名信...

2019-07-29 17:45:40 6444

原创 Objective-C Method Swizzling 的最佳实践

Objective-C Method Swizzling 的最佳实践Objective-C 中的 Method Swizzling 是一项异常强大的技术,它可以允许我们动态地替换方法的实现,实现 Hook 功能,是一种比子类化更加灵活的“重写”方法的方式。Method Swizzling 的原理Method Swizzling 是一把双刃剑,使用得当可以让我们非常轻松地实现复杂的功能,而...

2019-07-29 16:20:41 136

原创 OC如何实现多重继承

当单继承不够用,很难为问题域建模时,我们通常都会直接想到多继承。多继承是从多余一个直接基类派生类的能力,可以更加直接地为应用程序建模。但是Objective-C不支持多继承,由于消息机制名字查找发生在运行时而非编译时,很难解决多个基类可能导致的二义性问题。不过其实 Objective-C 也无需支持多继承,我们可以找到如下几种间接实现多继承目的的方法:**消息转发 ****delegate和...

2019-07-29 11:21:13 1123

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除