【iOS重学】制作动态库最全流程
写在前面
上一篇文章【iOS重学】制作.a静态库和.framework静态库最全流程详细讲了一下iOS里面静态库的制作方法,本文主要是讲一下iOS中动态库的制作方法,博主这里说的framework动态库跟系统的动态库比如UIKit.framework等是有很大区别的,具体区别我们将放在下一篇文章分析静态库和动态库的区别时再细说。
制作.framework动态库
如果看过博主关于制作静态库的文章,那么本文其实和上一篇的制作.framework静态库的方式是一样的,本文博主准备再来细说一下整个流程。
Xcode - Framework & Library - Framework,将需要打包的代码和图片等资源拖拽到项目中,博主这里以WWPrint文件为例。
将所有需要暴露在外面的.h头文件统一整合到DynamicFramework.h头文件中。
配置framework
Build Active Architeture Only设置为NO。
Base SDK选择iOS。
iOS Deployment Target选择打包出来的动态库最低支持iOS版本。
Mac-O ...
【iOS重学】制作.a静态库和.framework静态库最全流程
写在前面
本文记录的主要有两点:
.a静态库的制作流程以及使用
.framework静态库的制作流程以及使用
制作.a静态库
第一步:Xcode新建项目 - Frame & Library - Static Library。
第二步:博主这里取名为:StaticLibrary,这里出现的两个文件没有用可以删掉。
第三步:把想要打成静态库的文件放在StaticLibrary文件夹下面,博主这里以WWPerson文件为例。
第四步:修改BuildSetting配置,将Build Active Architeture Only 设置为NO。
第五步:添加需要暴露在外面的.h文件,.m文件会自动编译到.a文件中。
在未添加之前是下图所示:
点击+添加,添加之后:
需要注意的是:这里需要暴露的.h文件需要放在Public列表栏里面。
第六步:Edit Scheme - 模式改为release模式。
第八步:分别在真机和模拟器上都要Command+B编译,编译之后我们可以看到如下内容。
其中,Release-iphoneos代表的是真机下的静态库文件,Release ...
【iOS重学】线程保活
写在前面
本文主要讲一下线程保活是什么、线程保活的意义、如何实现线程保活。
线程保活
线程生命周期
【新建】:创建一个线程对象。
【就绪】:线程调用start方法,将线程加入可调度线程池中,等着CPU的调度。
【运行】:CPU调度当前线程执行。
【阻塞】:当满足某个预设的条件时(比如休眠或者同步锁)会阻塞线程执行,重新将线程设置为【就绪】状态。
【死亡】:线程任务执行完毕或强制退出,线程生命周期结束。
什么是线程保活
线程保活:一般情况下,当线程执行玩一次任务之后需要进行资源回收也就意味着生命周期结束,线程保活就是保证线程的生命周期不结束。
线程保活的应用场景
当一个任务随时都有可能去执行它,那么这个任务应该放在子线程去执行,并且让子线程一直存活,避免频繁创建线程而造成的性能损耗。
大家如果看过AFNetworking的源码就会看到框架里面是有用到线程保活的。
如何实现线程保活
// WWPermenantThread 类@interface WWPermenantThread : NSObject/** 关闭线程 */- (void)stop;/// 在保活的线程里面执行的任务 ...
【iOS重学】关于RunLoop的简单介绍
写在前面
本文主要是记录关于RunLoop的一些简单介绍。
RunLoop
基本认识
RunLoop:翻译过来叫运行时循环,指的是在程序运行过程中循环的做一些事情。
主要应用在:
定时器(Timer)、PerformSelector
GCD
事件响应、手势识别、界面刷新
网络请求
AutoReleasePool
上面是我们一个iOS程序的入口main函数,在UIApplicationMain函数中会去创建主线程的RunLoop对象,它用来保证程序不退出从而保证程序的持续执行。
我们可以把RunLoop运行时循环理解成一个do - while循环,伪代码如下:
int main(int argc, char * argv[]) { NSString * appDelegateClassName; @autoreleasepool { int retVal = 0; do { // 1.在休眠中等待消息 // 2.如果有消息 处理消息 }while(retVal = 0); ...
【iOS重学】Runtime中常用的一些API汇总
写在前面
本文主要是总结一下在我们日常项目中会用到的一些关于Runtime的相关API,便于以后查阅。
isMemberOfClass 和 isKindOfClass 区别
在正式总结Runtime下相关API之前,先看看isMemberOfClass 和 isKindOfClass的区别:
- (BOOL)isMemberOfClass:(Class)cls;+ (BOOL)isMemberOfClass:(Class)cls;- (BOOL)isKindOfClass:(Class)cls;+ (BOOL)isKindOfClass:(Class)cls;
我们来看一下这几个方法的底层实现:
- (BOOL)isMemberOfClass:(Class)cls { return [self class] == cls;}+ (BOOL)isMemberOfClass:(Class)cls { return self->ISA() == cls;}- (BOOL)isKindOfClass:(Class)cls { ...
【iOS重学】一篇文章讲清楚super
写在前面
经常在网上看到[super xxx]这种输出什么内容等类似的面试题,本文就主要来详细剖析一下这种[super xxx]中super调用的底层原理。
场景
博主这里用一个常看到的面试题来引出本文的主题:
// Person类@interface Person : NSObject@end @implementation Person@end// Student类@interface Student : Person@end@implementation Student- (instancetype)init { if (self = [super init]) { [super class]; NSLog(@"1 - %@",[self class]); NSLog(@"2 - %@",[super class]); NSLog(@"3 - %@",[self superclass]); NSLog(@"4 - ...
【PS学习】图层相关基本操作
写在前面
相关文章:
1、【PS学习】初识PS界面
2、【PS学习】文件基本操作
3、【PS学习】色彩基础
本文主要记录一下图层的一些基本操作,PS版本为【PS2020】。
初识图层
图层的显示与隐藏
【菜单栏】窗口 - 图层(快捷键F7)
如下:
改变图层缩略图大小
选择图层 - 右击 - 改变缩略图大小
如下:
新建的图层默认是透明的,如何想要给当前图层设置颜色,在选择颜色之后填充即可改变图层的颜色。
如何填充?
快捷键:Shift + F5
如下:
如何选择多个图层进行编辑
Shift + 需要选择的图层(连续性)
command + 需要选择的图层(非连续性)
如何复制一个图层
图层 - 右击 - 复制图层
option + 需要复制的图层 - 拖动
修改图层的名称和颜色
图层面板 - 选择图层 - 右键选择颜色(可以用来突出图层)
如下:
复制图层
选择图层 - 右键 - 复制图层
command + J
锁定图层
锁定透明像素:锁定之后 画笔工具无法在透明区域进行绘制。
锁定图像像素:锁定之后 无法在该图层上使用画笔工具。
锁定位置:锁定之后 图像的位置就不能 ...
【工具使用】Reveal工具的使用介绍
写在前面
有时候我们可能想要分析其他APP的一些整体View结构,就像在Xcode分析我们自己的APP一样能够清楚看到个层级结构,Reveal这个APP主要就是这个功能:用来分析APP的层级结构。
Reveal
Reveal APP 官网:https://revealapp.com/
Reveal APP下载地址:https://revealapp.com/download/
这个是官网正版,可以免费试用14天。
Reveal的基本使用
打开Reveal,菜单栏Help - Show Reveal Framework in Finder
真机下的配置
找到RevealServer.framework - ios-arm64 - RevealServer.framework
打开iFunBox - 将RevealServer.framework复制到iFunBox中 Library/Frameworks中
在手机Cydia中搜索Reveal2Loader进行安装
手机设置 - Reveal - Enabled Applications - 选择允许Reve ...
【iOS重学】方法缓存cache_t的分析
写在前面
本文我们主要来分析一下方法缓存cache_t的数据结构是什么样的,苹果是怎么实现方法缓存的。
Class的结构
在【iOS重学】窥探Class的结构文中,我们主要分析了Class的结构,结构主要如下:
struct objc_class : objc_object { Class isa; // isa Class superclass; // superclass cache_t cache; // 方法缓存 class_data_bits_t bits; // 具体的类信息}
其中isa、superclass、bits我们都已经讲过了,相关的文章可以参考【iOS重学】详细分析isa和superclass和【iOS重学】class_rw_ext_t结构详解,现在我们就来主要分析一下方法缓存cache_t。
方法缓存cache_t
我们都知道查找一个方法的流程大概是:根据isa指针找到类对象,在类对象上找是否有对应的方法,如果没有找到就根据superclass指针找到其父类查看是否有方法实现,以此往上找:
但是如果每次都这么寻找,效率肯定会很低, ...
【iOS逆向】Cycript的基本使用
写在前面
本文主要是介绍一下逆向中Cycript的基本用法。
简单介绍
Cycript是OC、C++、JS、Java等多种语法的一个混合物,它是用来探索、修改、调试当前正在运行的APP,这个在我们以后逆向的过程中会经常使用到,关于Cycript的更多介绍大家可以参考Cycript官网。
安装Cycript
在Cydia里面搜索Cycript进行下载,如下:
Cycript的基本使用
Cycript的开启和关闭
1、开启
保持Mac和iPhone的安全连接
使用命令cycript -p 进程ID或cycript -p 进程名称
如果不太了解Mac和iPhone怎么保持连接的,可以参考博主的另一篇文章:【iOS逆向】如何让Mac和iPhone建立安全连接。
如下:
这样我们就处于一个Cycript的语法环境。
2、关闭
快捷键:control + D
3、清屏
快捷键:command + R
查看进程的ID和名称
在以后逆向中,我们需要使用cycript -p 进程ID或cycript -p 进程名称来探究某个APP,那么这个进程ID和进程名称我们应该从哪里获取呢。
1、在Cy ...