![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
笔记
HaiJunYa
积极认真 好记忆烂笔头
展开
-
倒计时事件
#import <Foundation/Foundation.h>@interface NSObject (TimerDown)- (void)timerDown:(UIButton *)btn buttonTitle:(NSString *)title;@end#import "NSObject+TimerDown.h"@implementation NSObject (TimerDown)- (void)timerDown:(UIButton *)btn buttonTi原创 2021-12-17 00:10:19 · 243 阅读 · 0 评论 -
兼容共用Flutter(关注源码文件)
兼容共用Flutter体系中文网(条件筛选分支化UI增量支持体系包)。Flutter是谷歌公司提供的移动端UI渲染框架,可以快速的在iOS和Android设备显示屏上渲染出高质量的原生界面效果层。 Flutter体系其实相当于钥匙(触发点/类似代理概念下领导/提业务提需求不具体干活的/触发提出需求真正执行的指令依旧为底层包封装的OC/Swift/Studio),所以flutter体系下的源码与现有的苹果iOS代码一起合并生效。Flutter体系代码正被越来越多的开发者和组织使用,并且Flutter体系的底层原创 2020-10-20 17:27:27 · 155 阅读 · 0 评论 -
dyld(dynamicLinkEditor)加载流程(底层指令分析)
.cpp(c plus plus/c++)单元文件即c++体系下的单元文件。dyld(the dynamic link editor)是苹果体系的动态链接器,是苹果体系的操作系统重要组成部分,在系统内核做好程序准备相关的工作之后,接下来触发dyld动态链接器即由dyld负责余下的业务工作的处理分析响应反馈。而且它是开源的,任何人可以通过苹果官网下载它的源码来阅读理解它的运作方式,了解系统加载动态库的细节。...原创 2020-10-19 14:20:21 · 562 阅读 · 0 评论 -
dylib动态库加载顺序
dyld(the dynamic link editor):苹果动态链接编译器。研究在iOS中动态库的加载顺序是什么样子:1.实验篇(1)没有依赖关系:制作dylibA、dylibB、dylibC三个动态库(不了解动态库制作的问度娘),且3个动态库间没有依赖关系,同时在每个库中添加一个Class,暂且以Class的load方法的调用顺序当做是动态库的加载顺序,比如dylibA:@implementation ClassA+ (void)load { NSLog(@"dylibA loa原创 2020-10-16 17:10:44 · 1715 阅读 · 0 评论 -
iOS启动优化:AppDelegate管控
iOS项目工程中,AppDelegate管控辅助类执行域里面的指令码杂乱无章。任何模块只要存在业务功能方面的需要,就会往AppDelegate辅助类执行域中添加各种方法函数。特别是已完成启动相关的协议代理函数didFinishLaunchingWithOptions: 方法内涉及到各种定义权限注册通知等等指令更加复杂。把管控辅助类AppDelegate和Main函数之前的启动耗时写在一起?因为合理且统一的模块调用方式方便于批量化复制,可以更好的去统计每个模块调用的耗时,实现更精细化的监控。1.抽象统一的方原创 2020-10-15 19:59:18 · 359 阅读 · 0 评论 -
iOS启动优化:App 启动耗时 在线监控
数据存储在本地端硬盘区域里面以文件(夹)格式存在(普通文件、可执行文件、压缩文件等等各种文件)。应用APP程序正式启动之前需要消耗时间进行相关的数据文件文件数据的载入(过程:将相关的数据文件由本地端硬盘区域加载写入到内存里面)。超大型项目中,往往不经意改动,可能会直接或累加式拖慢App启动速度,测试人员通过本地录屏或开发工具测量启动耗时由于受测试机状态、样本数量、个人状态等原因,结果数据往往有波动不能真正反馈App启动耗时的真实变化。所以加入 在线数据监控 变得非常重要。一、App 启动耗时 在线监控原创 2020-10-15 17:46:02 · 1597 阅读 · 1 评论 -
苹果手机各种尺寸详细表以及iPhoneX、iPhoneXS、iPhoneXR、iPhoneXSMax、iPhone 11、iPhone 11 Pro、iPhone 11 Pro Max、屏幕适配
iPhone设备物理分辨率是硬件所支持的,逻辑分辨率是软件可以达到的。如图所示:原创 2020-10-14 16:02:15 · 17336 阅读 · 0 评论 -
load方法能否被Hook钩挂交换?(下)
名称load方法钩挂Hook的特殊分析*什么时机Hook?上文中解决分析了元类、load的调用顺序等问题,失败了?是不是Hook时机晚了呢?先来了解下名称load方法的调用原理,在ClassA类涉及的load方法调用处打个执行断点,看调用栈:动态链接器dyld完成对二进制文件(动态库,可执行文件)的初始化后将通过回调函数_dyld_objc_notify_register调用load_images和call_load_methods实现名称load方法的方法实例调用:voidload_image原创 2020-10-14 15:25:47 · 293 阅读 · 0 评论 -
load方法能否被hook钩挂交换?(中)
了解元类(Meta Class)。Objc中实例方法的调用是通过给实例对象发消息实现的,对于实例方法是可行的,但类方法呢?类方法的调用没有“实例对象”可以发送消息。所以Objc的设计者引入了元类概念:元类对象是描述类对象的类,每个类都有自己的元类,也就是类的isa指针指向的类,调用类方法实际上是给类的元类对象(isa指针指向的类)发送消息。上文中class_getClassMethod 实现是调用class_getInstanceMethod并且入参 cls->getMeta()获取元类(给类的元类对原创 2020-10-13 17:30:45 · 177 阅读 · 0 评论 -
load方法能否被hook钩挂?(上)
hook钩挂方式分为MethodSwizzle、fishhook、CydiaSubstrate等等多种钩挂方式。以MethodSwizzle为例研究:名称为load成员方法是否支持hook钩挂替换:能不能hook钩挂替换?首先看下Objc语系中成员方法所持有的实例发生交换的原理,下面是一段典型的实现方法交换的代码:什么时机hook:我们经常在load方法中hook其他方法,那hook load方法在什么时机呢?...原创 2020-10-12 23:08:09 · 297 阅读 · 0 评论 -
排序算法相关的时间复杂度和进程稳定性(下)
待继续分析原创 2020-10-10 18:04:59 · 440 阅读 · 0 评论 -
排序算法相关的时间复杂度和进程稳定性,快排的原理(上)
排序图表:有序的变化是矢量变化(矢量变化存在正负):(内部有序的部分+某个增量元素(同趋势))整体为具有同样有序趋势的新的有序部分。一、插入排序(逐个插入)(基底空容器)每次将某个待排序的数据,跟前面已经有序的序列数字一一比较找到自己合适的位置,插入到序列中,直到全部数据插入完成。二、希尔排序(跳跃式插入)(基底空容器)先将整个待排序的元素序列分割成若干个小规模子序列组(由相隔某个“增量”元素组成),在单个的小规模子序列组内分别进行直接插入排序,然后依次缩减分界增量元素再进行下一轮排序轮回,待整原创 2020-10-09 23:54:36 · 303 阅读 · 0 评论 -
methodSwizzling原理分析
最近看了一些关于iOS逆向工程的基础知识和某些开源代码。根据越狱CydiaSubStrate关于MSHookMessageEx挂钩信息功能补充部分API介绍:Objective-C提供了好用的high_level runtime API,允许开发者使用class_getInstanceMethod, method_setImplementation和更强大的method_exchangeImpletation来swizzle四维索引重排方法并改变替换功能执行。虽然API非常好用但API却不能胜任更复杂原创 2020-10-04 21:24:02 · 310 阅读 · 1 评论 -
内存管理机制
引用计数为0只是将对象加入到自动释放中了,没有真正意义上的释放。1、ARC环境下,Autorelease对象什么时候释放?在不同的方式衍生出@autoreleasepool中,待释放对象的释放时机不同,在iOS中分为两种情况释放时机:(1)如果在iOS项目工程中不手动添加@autoreleasepool非手工衍生释放池,那么项目中所有对象均由main函数中的@autorelease自动衍生的释放池管理,那么在一个runloop运行回路循环结束后,会清理自动释放池中的对象(应用代理对象)。(2)如果在原创 2020-09-30 14:04:43 · 128 阅读 · 0 评论 -
单项目工程存在多分支映射关系
原创 2020-09-29 10:32:25 · 97 阅读 · 0 评论 -
Implicit declaration of function ‘xxxx‘ is invalid in C99
Xcode中出现Implicit declaration of function ‘xxxx’ is invalid in C99警告的解决办法:该警告明确告诉我们在C99的规范中,不允许出现隐含声明的用法。这是C99规范中增加的规则,不过即便不遵守此规则,也仅仅是一个警告而已。什么是隐含声明呢?就是你调用c函数的单元文件中,没有正确包含对应的头文件。一般来说c/c++会将类/函数的声明放在头文件中,这样在需要的时候包含对应头文件就可以了,在编译器的前期处理中,需要通过头文件来建立一些函数,变量,类的表原创 2020-09-28 17:19:03 · 6074 阅读 · 0 评论 -
@selector(<#selector#>)
方法实例的地址消息将通过selector(方法实例的枚举盒)转换器入参写入objc_msgSeng函数Eg:[object hello]实例对象object的堆内存区里面存在次级实例方法hello =>> 底层触发指令objc_msgSend(object,@selector(hello))#import <Foundation/Foundation.h>@interface TestObject : NSObject- (void)justTest;@end#impo原创 2020-09-27 15:14:46 · 421 阅读 · 0 评论 -
目标对象T—所属项目工程P
目标对象T—所属项目工程P真机设备架构A(i386内核/X8664内核)模拟器架构B(i386内核/X8664内核)构建框架包sdk匹配8种模式:2^3Debug真机设备架构i386内核Debug真机设备架构X8664内核Debug模拟器架构i386内核Debug模拟器架构X8664内核Release真机设备架构i386内核Release真机设备架构X8664内核Release模拟器架构i386内核Release模拟器架构X8664内核静态库/动态库 可类比次元小世界。。。全局搜原创 2020-09-24 18:29:00 · 111 阅读 · 0 评论 -
main函数/方法
C语言构建的项目工程启动入口函数为main函数,OC语言创建的项目工程包含一个main.m文件(存在main函数作入口函数)int main(int argc, char * argv[]) {NSString * appDelegateClassName;@autoreleasepool {appDelegateClassName = NSStringFromClass([AppDelegate class]);}return UIApplicationMain(argc, argv, nil原创 2020-09-24 18:24:21 · 549 阅读 · 0 评论 -
addSubview机制
元件实例通过addSubview成员方法实现子层控件向父载体层的添加,首先机制会判断当前所研究的父载体层上面是否已经承载有子层控件实例,如果本身父载体层上面已经承载有子层控件实例,直接保留不做变化,如果本身父载体层上面并没有相应的子层控件实例则做正式的添加操作实现添加效果。物质世界事务不会凭空消失也不会凭空产生,同一个实例元组件(同一片内存区域)多次执行addSubview添加子层方法,子层控件会出现在最后一次添加的父层上面。 UIButton *btn = [[UIButton alloc] initW原创 2020-09-23 16:44:09 · 847 阅读 · 1 评论 -
沙盒原理机制
1、沙盒机制介绍iOS中沙盒机制是一种安全体系,对应着某片独立的存储空间。任意一个iOS移动端程序项目工程都有各自独立的文件系统(独立的存储空间),项目工程应用程序的各种操作效果数据的来源都只能在对应的独立的文件系统存储空间内进行(沙盒空间)。应用程序项目工程的任何操作必然是在自己的沙盒对应的独立存储空间里进行操作,应用程序项目工程和独立的沙盒空间是彼此一一对应的。A应用程序不能访问B项目的沙盒。所有的非代码规则文件都要保存在对立的沙盒内存空间中(某片特殊特性的内存区域),例如属性文件plist、文本文原创 2020-09-23 16:02:58 · 714 阅读 · 0 评论 -
调试反汇编窗口
原创 2020-09-21 16:02:20 · 373 阅读 · 0 评论 -
ios中设置button为不能点击且变灰
//不可触发self.button.userInteractionEnabled=NO;//交互关闭self.button.alpha=0.4;//透明度//可触发没效果指令原创 2020-09-21 15:18:23 · 2358 阅读 · 0 评论 -
/usr/bin/clang failed with exit code 1
Xcode报错:Command /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/b使用xcode编译工程发现一个问题,这里记录一下防止忘记xcode报错:Command /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang failed with exit原创 2020-09-21 14:46:25 · 2705 阅读 · 0 评论 -
日常好用免费视频剪辑软件
相信很多人在选择视频剪辑软件的时候都会想到像Final Cut 、PremiereCC、Edius等等这些软件,但是,这些软件要使用起来步骤就会十分复杂。首先,是下载,大多数官方正版都是要钱,而且购买起来就非常贵,相对于大学生来说,基本上负担就有点重。其次,有许多软件都出了破解版,但是,破解也很麻烦,正如,安装后把这个复制进去然后,(省略一大堆操作),还有一些是英文版的软件还需要另外下载中文补丁,就算有些操作比较简单,但是相对于直接下载就可以用的软件来说,还是比较麻烦的。这里向大家推荐8款直接下载就可以用的原创 2020-09-21 14:13:43 · 2783 阅读 · 0 评论 -
构建Bundle绑定包
iOS 如何把数据内容资源打包成bundle绑定文件包。1.创建基本的bundle绑定模版:2.点击创建好的bundle模版,属性设置2.1Base SDK设置iOS/Supported Platforms iosBuild Active Architecture Only设置为 “YES”2.2Installation Directory删除掉后面的路径2.3Code Signing Identity 选择 Don’t Code Sign2.4iOS Deployment原创 2020-09-18 15:53:45 · 711 阅读 · 0 评论 -
AssetCatalog资产目录
asset catalog:本质上是复杂的普通型大文件夹(XXXX.xcassets文件夹)原创 2020-09-17 16:46:38 · 285 阅读 · 0 评论 -
预处理命令#if#ifdef#ifndef
<#初实例值#>编码占位提示语言表达式整体可视为不方便远程访问不方便调用的隐式别名手机上面关闭消息通知推送避免叮咚响<#macro#>单独头h文件里面可以定义声明面向整个项目工程程序的全局型量符号开发者自己手工操作按部就班操作/自动操作需要设置窗口中设置属性引子preprocessor macros 预处理宏编写转化编译阶段:预处理命令(预处理阶段能够被机器识别辨别并分析做出回应的可响应指令/命令)普通操作命令(预处理阶段不会被机器识别辨别也不会被机器分析机器也不原创 2020-09-16 13:31:28 · 591 阅读 · 0 评论 -
static、const、extern组合使用
<#初实例值#>编码占位提示语言表达式整体可视为不方便远程访问不方便调用的隐式别名手机上面关闭消息通知推送避免叮咚响static关键字和const关键字联合使用:项目工程程序运行时堆内存区域中的静态区部分一直存在不会释放。static关键字和const关键字联合定义声明出 某个 只读的静态常 量符号(在某个单元文件分支逻辑/某个项目工程分支逻辑下需要经常使用的字符串常量可以通过static与const组合定义声明)。extern关键字和const关键字联合使用:作用:extern关原创 2020-09-14 14:47:27 · 385 阅读 · 0 评论 -
OC关键字static
static修饰全局变量1.在全局变量前加static,全局变量就被定义成为一个全局静态变量(全局变量和静态全局变量的生命周期是一样的,都是在堆中的静态区,在整个工程执行期间内一直存在)特点如下:1)存储区:静态存储区没变(静态存储区在整个程序运行期间都存在);2)作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。非静态全局 变量的作用域是整个源程序(多个源文件可以共同使用); 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源原创 2020-09-13 22:44:53 · 249 阅读 · 0 评论 -
OC关键字const
常量非常量主要分析点在于堆内存区的读写特性。底层clang编译器编译机制作用下,不推荐将字符串常量抽像成宏符号。宏符号 与 字符串常量 比较:1.编译时刻:宏符号是预编译(正式编译之前先替换处理),const是编译阶段检查。2.编译阶段检查:宏符号不做检查,不会报宏符号替换的编译错误,只是单纯的替换,const会进行编译检查,会在编译阶段报语法错误。3.宏好处:某些函数,方法可以通过宏符号替换。 const常量堆内存区不能代替函数、方法。4.宏坏处:使用大量宏符号,每次都需要大量的预编译时间作重原创 2020-09-13 13:17:12 · 192 阅读 · 0 评论 -
OC中 关键字extern
属性成员名称/类中成员变量/项目工程全局型变量extern修饰声明 项目工程全局型变量(所在的可执行项目工程里面的任何位置都可以调用该全局型变量字段)。extern与头h文件的关系:声明头h文件方便其他文件(类)去调用本h文件中定义的类中成员变量、属性成员名和类中成员方法名。//类 定义声明区域@interface <#class name#> : <#superclass#>{<#栈器皿结构特征#><#类中成员变量名称#>;//eg:NSStr原创 2020-09-11 15:53:16 · 1005 阅读 · 0 评论 -
info.plist配置文件(项目工程)分析
原创 2020-09-11 10:31:44 · 109 阅读 · 0 评论 -
NSBundle理解(绑定包)
bundle捆绑包/绑定包(bundle绑定包处于独立的硬件空间),Xcode工程师构建的可执行的项目工程的压缩产品软件包(ipa)本身也可视为某个绑定包(主绑定包mainBundle(主体研究对象方向))。主绑定包mainBundle包含可执行的逻辑规则代码指令和开发者注入的相关资源如图片资源/音频资源/视频资源等等。结构层次概念体系NSBundle类用来定位可执行资源所处的位置,获取具体的可执行文件的位置而后加载进入内存中供CPU调用。NSBundle的使用仅限制于独立的绑定空间(对于独立的绑定空间可原创 2020-09-09 16:26:20 · 769 阅读 · 0 评论 -
NSUserDefaults
[[NSUserDefaults standardUserDefaults] setObject:esString(model.industryId) forKey:@“industryId”];[[NSUserDefaults standardUserDefaults] synchronize];[[NSUserDefaults standardUserDefaults] objectForKey:@“industryId”]原创 2020-08-12 20:15:24 · 107 阅读 · 0 评论 -
weak修饰弱引用变量在运行时机制下自动nil效果
NSString obj = [[NSData alloc] init];编译时尚未进行内存的alloc开辟,编译时obj变量呈现出所指定的NSString风格类型。运行时通过alloc动态的开辟出具有NSData风格类型的内存区域为obj持有(赋值),运行时obj变量的类型为实际持有的实例对象的类型。Runtime运行时机制实现weak弱引用变量自动nil效果Runtime运行时机制下在动态的注册和初始化一个类实例时,当实例对象堆域中的某个次级属性成员变量被weak弱引用修饰时,会将weak修饰的原创 2020-06-10 15:44:09 · 224 阅读 · 0 评论 -
Runtime运行时机制实现weak弱引用变量自动nil效果
NSString obj = [[NSData alloc] init];编译时尚未进行内存的alloc开辟,编译时obj变量呈现出所指定的NSString风格类型。运行时通过alloc动态的开辟出具有NSData风格类型的内存区域为obj持有(赋值),运行时obj变量的类型为实际持有的实例对象的类型。Runtime运行时机制实现weak弱引用变量自动nil效果Runtime运行时机制下在动态的注册和初始化一个类实例时,当实例对象堆域中的某个次级属性成员变量被weak弱引用修饰时,会将weak修饰的原创 2020-06-09 22:59:40 · 198 阅读 · 0 评论