自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

TuGeLe的博客

开放协作 追求卓越 知行合一 不忘初心

  • 博客(97)
  • 收藏
  • 关注

原创 如何记录键盘SIGQUIT次数

Unix信号在计算机科学中,信号(英语:Signals)是Unix、类Unix以及其他POSIX兼容的操作系统中进程间通讯的一种有限制的方式。它是一种异步的通知机制,用来提醒进程一个事件已经发生。当一个信号发送给一个进程,操作系统中断了进程正常的控制流程,此时,任何非原子操作都将被中断。如果进程定义了信号的处理函数,那么它将被执行,否则就执行默认的处理函数。信号类似于中断,不同之处在于中断由处理器调解并由内核处理,而信号由内核调解(可能通过系统调用)并由进程处理。内核可以将中断作为信号传递给导致中断的进

2020-06-23 17:19:59 737

原创 iOS Block引用计数及内存管理

Block是在iOS4引入的新特性,是一种特殊的数据类型,今天我们就从源码层面探索一下Block具体是一种什么类型,并探寻下Block的内存管理方式。一、Block类型对于Block是什么类型,其实网上已经给出了答案,那就是Block实例也是一种对象。这个观点是完全正确的,我们可以从以下两个方面进行验证:1. 源码目前关于Block的源码是公开的,具体下载位置为地址。对于Block,本质上是一个结构体,其内容如下:#define BLOCK_DESCRIPTOR_1 1struct Block

2020-06-17 17:39:23 837

原创 利用.sym跨平台解析iOS符号

一、背景在iOS开发中,我们经常会遇到各种各样的线上问题,为了能够定位线上问题发生位置,我们搭建了各种各样收集信息的框架,当线上发生问题时,会收集到发生问题的方法调用栈信息,这些信息可以帮助我们来解决相关问题。无论是我们自己搭建的框架还是直接使用各种第三方收集框架,我们拿到的方法栈调用信息通常都是一些符号,为了能够从这些符号中获取正确的方法名,我们需要在线上包对应的dSYM文件帮助下进行符号化,进而得到明确的方法名。对于如何使用dSYM文件来解析符号,网上已经有了很多质量很好的教程,推荐其中一个教程。

2020-06-05 17:51:11 1385

原创 泛型在开发中的应用

编写Clang插件实践一、什么是Clang?Clang 使用的是模块化设计,可以将自身功能以库的方式来供上层应用来调用。比如,编码规范检查、IDE 中的语法高亮、语法检查等上层应用,都是使用 Clang 库的接口开发出来的。二、Clang 提供了什么能力?Clang 为一些需要分析代码语法、语义信息的工具提供了基础设施。这些基础设施就是 LibClang、Clang Plugin 和 Li...

2020-03-30 08:42:04 468

原创 iOS黑暗模式适配调研

iOS黑暗模式适配调研一、前言在iOS13之后,苹果系统及其应用就开始全面适配和支持黑暗模式了;为了增加iOS的一体性与用户的体验,苹果官方又进一步强烈建议所有上架Apple Store的App进行DarkMode的适配。二、如何不进行系统切换样式的适配因为适配黑暗模式对于设计和开发者来说都存在一定的工作量,所以对于还没有完全准备适配DarkMode的App来说,需要一个过渡阶段以保证Ap...

2020-03-30 07:36:13 976

原创 使用配置文件的apk安装编译分析

众所周知JVM执行的是.class字节码,而Android的Dalvik或ART是不能直接运行.class文件,运行的是编译生成的dex文件,并且不同版本的Android在运行时对dex的编译策略也存在着变化。在Android4.4之前Android虚拟机是Dalvik,在Android2.2到Android4.4时期,其执行的时候采用的是JIT编译,当App运行时,每当遇到一个新类,JIT编译器...

2020-02-27 07:05:46 2778

原创 iOS UIGestureRecognizer与原生响应机制处理流程分析

之前在组内分享的时候,曾提到过在iOS事件响应机制中,当原生触摸事件与手势搭配时,相关方法的调用顺序。之前是将手势也理解至响应者链中,后来发现理解有误,所以在此进行一些总结。UIGestureRecognizer与原生触摸事件均为处理用户点击事件,所以两者必然存在着紧密关联,所以在探究UIGestureRecognizer响应机制之前,我们先了解一下原生触摸事件的响应机制。由于iOS系统的封闭...

2020-02-19 17:58:20 1850

原创 深入了解iOS中的OOM(低内存崩溃)

在iOS开发过程或者用户反馈中,可能会经常看到这样的情况,用着用着就崩溃了,而在后台查看崩溃栈的时候,找不到崩溃日志。其实这大多数的可能是系统产生了低内存崩溃,也就是OOM(还有一种可能是主线程卡死,导致watchdog杀掉了应用),而低内存崩溃的日志,往往都是以JetsamEvent开头的,日志中有内存页大小(pageSize),CPU时间(cpuTime)等字段。什么是OOM?什么是OOM...

2020-01-16 14:48:55 19696

原创 iOS weak关键字实现原理

在iOS中,使用weak关键字能够对内存对象进行弱引用,基于这个特性,使用weak关键字能够解决许多问题,例如delegate中对象的循环持有问题、Block对对象的强引用导致的对象无法及时释放问题。为何weak关键字能够实现对内存对象的弱引用,今天我们就来探究一下。首先在分析weak关键字实现原理之前,先介绍一下相关的数据结构,这些数据结构其中一部分可能在其他地方有所提及,但本文只列出与we...

2020-01-07 20:41:09 1571

原创 非越狱砸壳方式总结及坑

一、引言大家都知道,在进行非越狱开发的过程中,需要对第三方应用的包进行重签名,并向MachO文件实行相关自定义库的注入操作,而这些都离不开需要对原始的二进制进行砸壳,原因是AppStore上的应用在开发者提交上去的时候都进行了加密。虽然对于版本要求不高的应用可以通过PP助手直接下载已经砸壳的应用,但是仍有一些需求需要直接拿到当前线上版本的应用来进行处理,这就不得不需要自行掌握砸壳的一些技巧或方...

2019-12-24 18:39:03 9718

原创 几种Cocoa开发中的IPC方案

​ iOS系统相对于Android系统来说非常的封闭,每个应用的活动范围被严格地限制在各自的沙盒中,也许这是为了保证系统的安全性,避免恶意的应用去偷取其他应用的隐私信息。不过这同时也就阻碍了系统中应用之间或者与Extension间某些必要的跨进程通信。​ Unix系统提供很多进程间通信的渠道,比如pipe、FIFO、共享内存、消息队列、信号等方式,但是iOS非越狱系统都对这些层级的API加了权限...

2019-12-24 17:53:06 1262

原创 iOS CALayer动画原理分析

一、引出问题在开始分析原理之前,我们先来看一个问题:我们都知道 UIView与 CALayer之间的关系,通俗的来说,UIView内部封装了一个 CALayer, 其中 CALayer负责展示UI,而 UIView负责处理交互事件。其中 UIView的所有UI信息都会对应到 CALayer上,即改变 UIView的位置信息与改变 CALayer的位置信息效果是一样的。由上述结论,如果我们只...

2019-12-05 20:49:06 896

原创 iOS代码混淆初探

iOS代码混淆初探在没有对应用的代码做过特殊处理的情况下,一般应用的代码中的类名和方法都是明文的。在逆向分析中,通过class-dump获取MachO可执行文件中的所有类、定义的方法和属性,就能很快的从名字入手猜到这个方法是做什么用的,所以类名和方法名的混淆就特别重要了。方法一:运用宏定义的方式进行混淆这是一种比较简单又方便的做法,我们只需要在release打包时将现有工程里面的类名和方法名...

2019-09-18 11:38:55 1680 1

原创 应用的构建过程与签名

应用的构建过程与签名一、引言在逆向开发的过程中,一些常用逆向工具和逆向分析的技巧已经被我们所熟知和运用,但其中所用到的理论基础往往容易被忽略。理论基础的储备能够拓宽逆向分析的思路,并在遇到问题时很快的找到原因和应对的方法,从而使得逆向开发的过程变得轻松。下面从基础的包结构、包构建以及包安装进行解读。二、应用包的格式苹果的应用包主要是ipa格式的,其本身就是zip的压缩包,右键“归档实用工具...

2019-09-18 11:30:24 554

翻译 Cocoa编码规范

介绍Cocoa编码规范开发一个Cocoa framework,插件或者其他具有公开API的可执行文件时,需要采取与那些应用开发不同的方法和约定。你产品的初始客户端是开发者,非常重要的一点就是不要让他们为你的编程接口感到困惑。以下便是API的命名约定,能够帮助你让你的接口保持一致和清晰,这些对于你来说,迟早排得上用场。同样还有比较特殊的针对更重要的与框架有关的编程技术,例如,版本标注、二进制兼容性...

2019-03-18 20:25:13 577

翻译 WWDC2018 session 225

一、引言Session 225 《A Tour of UICollectionView》从三方面来对 UICollectionView进行讨论,分别是 Layouts、 Updates以及 Animations。在正式开始讨论之前,先了解一下 UICollectionView的三个重要概念: Layout、 Data source以及 Delegate。二、UICollectionView相...

2019-03-11 17:29:33 366

原创 synchronized实现原理及缺陷分析

@synchronized是 Objective-C中提供的一个用来快速加锁操作的关键字,该篇文章就深度分析一下该关键字的实现原理,并从中找出一些使用中的注意实现以及使用缺陷。一、使用方式@synchronized关键字的使用十分简单,如下:- (void)testSynchronized { @synchronized (self) { NSLog(@"call t...

2019-03-11 17:28:22 1600

翻译 在Xcode中更快构建项目(WWDC 2018 session 408)

WWDC 2018 session 408: ++Building Faster in Xcode++引言这个session主要讲的是如何在Xcode中构建的更快。基于不同的项目本身的配置及复杂性,有很多机会可以让您对其进行改造。在某些情况下,可以显著的提高您的构建内容的运行情况。接下来会从两个不同的角度来提高Xcode的构建速度。一是提升您的整理构建效率;二是减少您在构建中需要做的工作,...

2019-03-06 16:58:04 531

原创 NSTimer精准度及影响因素分析

项目中经常会遇到需要定时循环执行某些方法的场景,例如发送短信倒计时需求,此时NSTimer就派上用场了,关于NSTimer的用法在此就不做多的解释,这里要讨论的是NSTimer真的可以准确完成定时触发的功能吗?一、NSTimer是否是精准的?首先我们先看一下苹果官方对于NSTimer的定义:Timers work in conjunction with run loops. Run loop...

2019-03-04 21:02:27 811

翻译 WWDC2018 session 221

该篇博客记录了观看WWDC Session201《TextKit Best Practices》的内容以及一些理解。一、关键概念(Key concepts)1. TextKit框架组成TextKit框架无需导入,因为UIKit和AppKit中所有文本控件都是建立在TextKit之上的。TextKit还继承了很多技术,包括Core Text、Core Graphics以及Foundation...

2019-01-25 21:28:24 685

原创 +initialize方法的调用时机

+initialize方法的调用时机一个类或者它的子类收到第一条消息(手写代码调用,+load方法不算)之前调用,可以做一些初始化的工作。但该类的+initialize的方法调用,在其父类之后。Runtime运行时以线程安全的方式将+initialize消息发送给类。也就是说,当一个类首次要执行手动调用的代码之前,会等待+initialize方法执行完毕后,再调用该方法。这里需要注意的一点:...

2019-01-23 16:04:44 2516

原创 +load方法的执行顺序你了解么?

可能+load方法应该是每个iOS开发同学都非常熟悉的方法,而且面试中+load方法相关的面试提也是非常常见,但你了解的+load方法真的跟实际上的一样么?看文章之前先思考几个问题+load方法在什么时候?+load方法是如何执行的?一个类的+load方法会执行几次?类和分类的+load方法的执行顺序?同一个类的不同分类的+load方法的执行顺序?父类和子类的+load方法的执...

2019-01-22 18:16:55 4072

原创 ffmpeg减少编译包体积技巧

ffmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。其实ffmpeg只是对该框架的通俗称呼,该框架本质上为libav,ffmpeg也只是基于libav开发的一套工具。libav框架可以编译在其他平台进行使用,在下载的源码中,包含有configure程序来进行编译工作,但是单纯的运行该程序进行编译,编译生成的包体积是非常大的,所以我们需要进行一些配置来减小编译包...

2019-01-17 20:37:19 4353

原创 合成GIF时的透明处理与优化

在与图片相关的开发中难免会遇到gif的处理,由于gif这种格式的局限性,可能合成的gif文件和自己预想的出现明显差别。在我们的项目中就曾长期受到,透明图片合成gif后,透明位置变成黑色的问题困扰,我们就将bitmap添加一个白色的不透明背景,但是显而易见,这不是根本上解决问题的方法。

2018-12-26 22:13:35 3124 1

原创 WebDriverAgent自动化框架

WebDriverAgent是适用于iOS 的WebDriver服务器实现;它允许启动和终止应用程序,点击和滚动视图或确认屏幕上的视图状态。这使其成为应用端到端测试或通用设备自动化的完美工具。它通过链接XCTest.framework和调用Apple的API来直接在设备上执行命令。安装配置WDA服务端:1.从github上下载WebDriverAgent代码git clone https...

2018-12-19 04:44:42 3955 1

原创 Runloop机制解析及应用

- Runloop学习背景在调研卡顿监控的过程中,接触到了Runloop机制及其用法,其中一种方案是通过监听每次Runloop循环的时间来判断是否出现时间的阻塞,并同时dump出正在执行的调用栈来定位执行时间较长的函数,进一步进行优化。同时还有通过开启另外的线程给主线程发送消息,看主线程Runloop是否能够处理Source事件来进行处理返回的时间来判断阻塞状况。- RunLoop定义在...

2018-12-19 04:43:40 525

原创 [CocoaPods]podspec文件中的resource和resource_bundle

相信基本上所有的iOS开发同学针对于CocoaPods都不陌生。即便没有用过,也是久闻大名如雷贯耳。作为Objective-C和Swift中非常流行的依赖管理工具,它拥有超过10000个公有程序库,通过一份Podfile文件和pod install命令就能帮助开发者方便的管理工程依赖。随着组件化越来越火热,大家都开始介入研究。组件化就免不了通过CocoaPods创建自己的私有代码库。而针对于一些...

2018-12-17 14:49:20 15482 1

原创 iOS易引起内存泄漏原因总结

最近通过Analyze及Leaks等工具对项目进行了内存泄漏问题的检测及修改,现对遇到的易造成内存泄漏的问题进行一些总结,每点中都列举了会造成内存泄漏的代码书写方式,并对其原因进行分析,最后给出了相关的解决方案。接下来就开始进行总结:一、 循环引用循环引用是在iOS可能引起内存泄漏的主要原因,这类问题常见的出现在Block的使用中,由于Block会持有所使用到的变量,下面就总结下Block使...

2018-12-10 21:06:11 1779

原创 探究Xcode New Build System对于构建速度的提升

在Xcode9发布的时候,Apple在Build System上提供了新版本的构建系统(New Build System),具体可见WWDC2017,不过令人失望的是,该新特性的讲解很简短,短到只在一页PPT上露脸,在这短短的时间里,苹果讲述了该构建系统的优点:降低构建开销,尤其可以降低大型项目的构建开销。当然对于该新特性的使用,苹果为开发者提供了足够的过度时间。在Xcode9中,该构建系统没有...

2018-12-07 18:35:03 8202 1

原创 iOS中mmap的应用

mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。相反,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共...

2018-11-26 20:55:51 2379

原创 Android程序架构优化

最近一段时间,看到了一些Android项目组件化相关的文章,同时,因工作需要对Java Spring框架进行了初步的学习,他贯穿整个应用系统的面向接口编程思想来解决业务逻辑和其他各层的松耦合问题的方案让我感受颇深,尤其是其通过控制反转(IoC)技术促进低耦合,面向切面的编程思想等,使程序员能够编写更简洁、易于管理的代码。借此机会,我对当前Android项目的整体架构进行了思考和优化,主要目的是为了...

2018-10-31 10:11:59 1360 1

原创 OCLint从安装到使用

OCLint是什么,引用官方对于OCLint的介绍:OCLint is a static code analysis tool for improving quality and reducing defects by inspecting C, C++ and Objective-C code and looking for potential problems. 通俗的讲,就是一个静态代码分析...

2018-10-24 20:01:50 3246

原创 利用CocoaPods创建基于SVN的私有库

CocoaPods简介CocoaPods是专门为iOS工程提供第三方依赖库的管理工具,通过CocoaPods,我们可以更方便的管理每个第三方库的版本,而且不需要我们做太多的配置,就可以直观、集成和自动化的管理我们项目中使用的第三方库。CocoaPods将所有依赖的库都放在一个名为Pod的项目下,然后让住工程依赖Pods项目。Pods项目最终会编译为一个libPod-项目名.a的静态库,主项目依...

2018-10-18 19:28:47 939

原创 动态调试及LLDB技巧集合

学习背景:在非越狱逆向开发的过程中,我们可以从界面(Reveal)、类与方法(class-dump)、或者网络(Charles)等方面及一个应用的功能点入手去寻找一些需要实现功能的入口线索。但是在未知源代码的情况下,想要精确定位一个功能点的实现位置及实现原理,就需要结合静态分析和动态调试来分析程序运行的动态和行为实现。静态分析静态分析是指在程序没有运行的情况下进行程序分析的一种方法,一般分...

2018-09-29 14:10:51 4394 1

原创 函数式编程初探引发的思考

在了解Spring 4.X时,作者提到Spring 4.X全面支持Java 8.0的Lambda表达式。开始初步了解函数式编程,说到其是一种编程范式,由此而联想到语言及程序设计思想,他们之间的区别和关系是什么,特此做了以下梳理。一、什么是编程范式所谓编程范式,指的是计算机编程的基本风格或典范模式,是如何编写程序的方法论。借用哲学的术语,如果说每个编程者都在创造虚拟世界,那么编程范式就是他们置身...

2018-09-25 12:30:50 263

原创 探究Objective-C中关联对象原理

一、实际问题1.提出问题首先,一切都要从一个问题开始:在Objective-C中,能否在Category中为类添加属性及对应的实例变量?该题的答案是:不能。2.分析解答为什么不能通过Category来为Objective-C的类添加属性及对应的实例变量呢?原因在于在编译完成之后,类的内存布局就已经确定了,如果此时为类添加实例变量,则会破坏已经确定的内存布局,这显然是不合理的。这一点,可以...

2018-09-20 18:00:27 501

翻译 WWDC2018 session 220

High Performance Auto Layout本视频主要是介绍了在使用Auto Layout中的一些注意事项,以及Auto Layout的原理,和iOS 12中对Auto Layout性能的优化。Auto Layout原理Auto Layout需要依赖一个个的约束,最终UIView根据这些约束确定自身的位置,宽高,完成布局和渲染。因此,理解Auto Layout的原理,其实就是理解...

2018-09-17 20:41:01 416

原创 在Cocoa框架中使用Swift的一些注意事项

虽然说Swift是作为一种全新的语言被推出的,但是不可避免的需要借助于Apple生态来对它进行推广,在推广的过程中,就不可避免的需要被使用在Cocoa设计模式中,所以我们今天来总结一下当Swift被使用在Cocoa设计模式中时需要注意的一些事项。在我们开始讨论之前,我们先来了解一下Swift与Objective-C的一些不同点。区别我们通过使用Swift与Objective-C来编...

2018-09-13 19:39:26 806

翻译 WWDC2018 session 202

What’s New in Cocoa Touch该文档主要是了解下Cocoa Touch的一些新特性。主要包括三部分,Framework updates、API enhancements、Siri shortcuts,下面针对这三部分逐一介绍。Framework UpdatesFramework Updates部分主要是针对性能做了一些优化,包括滑动时的性能、内存优化、自动布局性...

2018-09-10 17:44:04 652

原创 iOS导航栏自定义按钮响应区域优化

iOS 11中,系统重构了导航栏,UINavigationBar的层次结构发生了变化,同时影响了按钮UINavigationItem的布局位置以及响应区域。而针对于不同的系统,我们很多时候可能都需要做导航栏按钮的响应区域的优化。 本文会针对两个case来做导航栏响应区域的优化。case 1:iOS11以下系统导航栏按钮响应区域过大该case是在相册选择页面,导航栏右上角有一个取消按钮...

2018-09-05 15:50:26 3406 4

空空如也

空空如也

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

TA关注的人

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