KVC
我不知道有多少人像本人一样,n 年来查看过不知道多少次这个 KVC 文档,但是每次通篇读下来总是会遇到读不懂的地方,总是莫名其妙的出现一个章节完全不知道在讲什么东西,不论是用传统的 Google 翻译或者目前主流的 AI 翻译翻译了,也还是会遇到读起来狗屁不通的情况。 其实根本原因是原始文档就有问题,东拼西凑的一坨屎,有歧义,导致不论你是直译还是意译都是让人摸不着头脑的翻译,只能根据上下文...
iOS反调试与反反调试
反调试原理ptraceptrace (Process Trace) 是 Linux(以及其他一些类 Unix 系统,如 macOS)提供的一个极其强大且底层的系统调用。它的核心功能是允许一个进程(称为 tracer)观察和控制另一个进程(称为 tracee)的执行,并能检查和修改该进程的内存和寄存器。 核心功能 追踪器的介入 (Tracer/Tracee):...
Category
分类诞生的历史Objective-C 的分类(Category)语法并非随语言初始版本一同出现,而是随着语言发展逐步引入的重要特性。以下是关键时间线和技术背景分析: Objective-C 由 Brad Cox 和 Tom Love 在 1980 年代初基于 C 语言开发,旨在添加 Smalltalk 风格的面向对象特性。初始版本(1981年) 仅包含核心的面向对象机制(如类、继承、消息...
Associative References
分类能否添加属性?实例变量?在讲解 Associative References 为为何物之前,我们先看一下这个问题: 分类中能否添加实例变量?如果可以如何添加?如果不可以,解释为什么? 可以通过编译器看看能否在分类中添加实例变量: 如上图所示,在分类中虽然可以添加属性,但是并不会生成对应的实例变量,也无法手动添加实例变量。编译器提示,实例变量不能放在分类中。那么现在的问题是,为...
架构模式
什么是架构模式感觉MJ这块讲的不是很好,可能这个确实还是比较抽象,建议多结合ai总结吧。 常见的架构有 MVC MVP MVVM VIPER CDD @interface VTDListInteractor : NSObject @property (nonatomic, weak) id output; (instancetype)initWithDataManager:(...
多线程
相关面试题 你理解的多线程? iOS 中的多线程方案有哪几种?你更倾向于哪一种? 你在项目中用过 GCD 吗? GCD 的队列类型 说一下 OperationQueue 和 GCD 的区别,以及各自的优势 线程安全的处理手段有哪些? Objective-C 你了解的锁有哪些?在你回答基础上进行二次提问: 自旋锁和互斥锁对比? 使用以上锁需要注意哪些? 用 C/C++/Ob...
内存管理
相关面试题 使用 CADisplayLink、NSTimer 有什么注意点? 强引用控制器导致控制器,定时器均无法正常释放的问题 依赖 RunLoop,如果 RunLoop 任务繁重可能出现定时器不准时的问题 介绍下内存的几大区域 讲一下你对 iOS 内存管理的理解 autorelease 对象在什么时机会被释放 方法里有局部对象,出了方法后会立即释放吗? ARC 都帮我们做了什么? w...
Runloop
引出 RunLoop在学习 C 语言的时候,一般的命令行程序运行之后会马上结束。如果想要让程序不直接退出,而是一直等待用户的输入,并根据用户的输入决定是否退出程序,那就得加一个循环实现了。如以下这个简单的 C 程序: 1234567891011121314151617181920212223242526272829303132333435363738#include <st...
Block
Block 一些疑问 注意:本文章不是讲解 Block 基础的文章,需要读者有一定的 Block 编程基础。 Block 在我们日常开发中经常会用到,但是它的本质是什么? __block 是什么?有什么作用?有什么使用注意点? Block 的属性应该使用什么修饰词?strong 还是 copy?为什么 Block 的代码块内部修改 NSMutableArray,需不需要添加 __b...
深入理解 iOS 对象模型
001:讲了 Objective-C 对象的底层是 C 结构体 Objective-C 实例对象在日常使用 Objective-C 开发过程中,我们经常会使用 [[NSObject alloc] init] 这样的方式创建一个实例对象,并调用初始化方法。当然实际的情况中可能不是使用 NSObject 类,而是 UIKit 框架中的类,或者是你自定义的子类。实例对象对于我们来说简直是再熟悉不过...
iOS 底层原理导图
iOS 底层原理导图 iOS 底层知识入门 KVC KVO Category 关联对象 Block Runtime 深入理解iOS对象模型(一):实例对象的内存探秘 Objective-C 类对象 Runloop 多线程 线程同步方案(锁、串行队列) 内存管理 性能优化 架构设计
iOS 底层知识入门
iOS 底层知识入门很多讲 iOS 底层知识的课程,视频,文章,讲师上来就是一个 struct objc_object {...} 结构体或者是 struct objc_class : objc_object {...} 的结构体,我不知道其他人是怎么想的,但是对于我本人来说,第一次接触的感觉是一脸懵逼,这两个结构体是干什么的?平时开发过程中从来没有...
KVO
KVO 的官方文档相较于 KVC 的官方文档要好上很多,不会像 KVC 那样出现大量的莫名奇妙的内容,但我个人感觉说实话作为 Apple 出的官方文档,这个水平写的也是真的不能说好,只是相对而言比 KVC 写的要更加像是给人看的。同样作者也对该文档做了全篇翻译,有需要的读者可以自行 下载。 是什么?KVO 是英文 Key-Value Observing 的首字母拼接来的,翻译成中文就是键值观...
iOS 逆向与安全导航
制作中。。。
iOS 应用砸壳
什么是壳在软件保护和安全领域,“壳”指的是利用特殊的算法对应用程序的二进制文件进行加密或包装的保护层,通常被称为 “加壳”。壳的作用是保护应用程序的代码,防止未经授权的访问、篡改和逆向工程。壳通常会在应用程序启动时将其解密到内存中,以便正常运行。 苹果会在应用发布到 App Store 时,对应用程序进行 DRM(数字版权管理)保护,这种保护即一种壳,目的是防止非法分发。所以从 App St...
微信抢红包插件
本篇文章将介绍如何从 0 到 1 一步步实现微信抢红包插件功能,需要用到 一部能越狱的 iPhone,作者使用的 iOS12.5.7 的 5s。 推荐使用 iOS15 之前的设备,因为 iOS15 SSV 的出现诞生了一种新的越狱方案 rootless。导致很多以前能运行的越狱插件,工具都无法在 iOS15 及后续的系统上正常运行。因为这些工具大多都还没有针对 rootless 进行...
iOS逆向与安全开篇介绍
学习 iOS 逆向开发的前提 有一定的正向开发经验(最起码对 iOS 系统的 UIKit 框架有一定的了解) 一台越狱的 iOS 设备(推荐至少是 64 位架构,iPhone 是从 iPhone 5s 开始,iPad 是从 iPad Air 和 iPad mini 2 开始) 一台 Mac 电脑,理论上来说 Linux 或 Windows 也可以(实际上作者没有实践过) 时间和恒心 什么是...
2023年10月了黑苹果还香吗?性价比超高黑苹果台式机搭配&黑苹果安装教程
缘由最近一段时间对 iOS 逆向开发进行了一定的研究,之前也更新过一段时间的相关文章(后续由于搬家,不幸感染病毒🦠等一些原因断更了个把月),在学习和探索过程中,非常明显的感受到逆向分析对电脑的性能要求很高尤其是 CPU,在使用逆向分析工具 ghidra,hopper 等程序对 MachO 文件进行分析的时候,常常一分析就要等上大几个小时,而且我使用了 n 年的 MacBook Pro 在分...
Reveal
之前已经介绍过 Cycript 这个越狱动态分析的神器,Cycript 是纯命令式的分析工具,对于大多数人/普通开发者来说,这种方式还是显得太极客了。还是图形化的界面更容易接受和使用,所以今天介绍的就是这样一款神器 Reveal 。很多 iOS 的正向开发人员会感觉到困惑,说我用 Xcode 的 view debugger 用的挺好的啊。还去了解这个 Reveal 干什么。。。我只...
Cycript
什么是 CycriptCycript 是一种用于 iOS 操作系统的脚本语言,同时也是该语言的解释器(一般来说不需要编译的脚本语言都会提供它对应的解释器,比如 Python、JavaScript、Ruby、PHP 等),Cycript 是 JavaScript,Objective-C++ 等语言的混合物这意味着它能理解 JavaScript,Objective-C++ 甚至是 Objecti...
OpenSSH
简介平时在使用 Mac 的过程中,经常会使用终端输入命令来执行一些操作。在越狱开发的过程中,同样需要在 iOS 系统上输入一些命令来执行一些任务。那么如何才能在 iOS 系统上输入命令呢,在 iOS 上安装一个终端命令行工具,然后在 iPhone 那小小的屏幕上用触摸屏输入命令吗?虽然说理论上和实际上都是可行的,但是通过手指触摸屏幕来输入命令的方式效率比较低,也不是很方便。这里还是推荐在 M...
LLVM之clang插件开发
最终实现的效果在 Xcode 中使用自己编译的 clang 编译自己的源码,并给出符合自己风格或者公司所需的代码规范的提示!还可以给出修复建议 在动手开发之前,先了解一下相关理论知识,特别强调 clang 插件开发并不是一件很容易的事情,需要有一定的知识储备,你需要: 对 C++ 有一定的了解 对编译原理有一定的了解 不想了解,只想直接动手开发 clang 插件的可以直接跳到 cla...
Calendar 和 Reminders 编程指南
最近的项目需要用到 EventKit 来实现,于是在官网找到了这篇文章,虽然属于老文档了,但是对于需要接入 EventKit 的人来说还是有必要了解一下的。最新的文档也只是在这个基础上做了些更新,对于英语好的读者,完全可以直接看 官网介绍就好了,我这里是对官方文档的一遍翻译,再加上自己实践的一点点内容。 介绍 Calendars 和 RemindersEventKit 框架帮助您访问用户的日...
8天让iOS开发者上手Flutter之八
介绍四种 Flutter Project先介绍一下这四个的差别和使用的场景。 Flutter App如果是想要使用 flutter 开发一个新的项目,那么就选择 Flutter App。就像我们之前的 wechat_demo Flutter Module但是很多时候我们目前手上的原生 APP 可能会很庞大,不是随便就可以重新使用 flutter 重新再写一遍的。但是又想在现有的 APP ...
8天让iOS开发者上手Flutter之七
上一篇文章我们已经完成首页聊天页面的导航条和列表展示,今天的任务是完成搜索 cell 的展示和点击之后的搜索页面的功能。 自定义 SearchCell新建 search_cell.dart 文件 实现 SearchCell 代码SearchCell 的话,因为仅仅只是展示,点击之后就进入搜索页了,应该来说是不需要状态的,所以用一个 StatelessWidget 就够了。然后布局的方式使用...
8天让iOS开发者上手Flutter之六
发现了一个宝藏网址,这里讲解的 flutter实战 比我写的靠谱多了。 准备网络数据这一步不是很重要,提供一些假数据而已,不是重点嫌麻烦的可以跳过。 先介绍一个网址:http://rap2.taobao.org/account/login 这个网址用来搭建我们需要的网络数据,注册账号非常简单,这里就不多说了。 注册完成之后,新建一个仓库,简简单单取个名字就够了: 之后点击进入仓库,可以看...
8天让iOS开发者上手Flutter之五
上篇文章,我们已经完成了通讯录的列表。这篇文章介绍完成通讯录右侧的索引条的功能。 显示索引条之前我们已经做过了我的页面的布局,我的页面上有一个列表和一个拍照按钮,和我们今天要实现的索引条布局十分类似。我的页面的布局如下: 通讯录界面的布局,和我的页面的布局都是使用一个 Stack 包含列表和其他子视图来实现。索引条是紧贴屏幕右侧,然后里面的子视图是由上至下的。所以自然的会想到使用一个 P...
8天让iOS开发者上手Flutter之四
上一篇文章我们已经完成了发现页面的搭建,下一步我们实现微信的我的页面 我的页面在着手开发我的页面之前,先新建一个 discover 目录,将发现页面相关的文件统一挪动到这个目录下。这里会发现 Android Studio 一个比较特别的地方,新建一个目录后,挪动了的文件不需要重新导入头文件。AndroidStudio 会在需要的地方自动补全路径。这点感觉还是蛮智能的。 设置APP启动默认...
8天让iOS开发者上手Flutter之三
搭建项目主框架新建微信聊天,通讯录,发现,我的四个文件上一篇文章最后我们已经将 APP 的 TabBar 和四个对应的子视图搭建好了,但是每一个子视图里面肯定会有大量的代码,全部放到 rootPage 文件里面肯定是不合理的。所以我们为每个子视图创建单独的文件,并将代码分散到每个文件中。 比如聊天页面,返回自己的 Scaffold: 现在我们点击切换一下 tabBar 的 item,...
8天让iOS开发者上手Flutter之二
Flutter布局AlignmentContainer 类里有一个 alignment 属性,翻译过来应该叫对齐方式,这个属性用来控制 Container 的子控件相对于它自身的一个位置。在我们 iOS 开发中,我们知道坐标系的原点是在左上角。 而在 flutter 中,坐标系的原点在父控件的正中心,可以使用这个 alignment 属性来控制子控件在父控件中的位置,它有两个参数分别是 do...
8天让iOS开发者上手Flutter之一:快速入门Flutter
flutter 现在是越来越火了,现在作为一个 iOS 开发,如果你不会 flutter 都好像不算个正常人似的?而且现在的 flutter 情况,有点像 2012 年那会儿刚刚兴起的 iOS,Android 开发一样,会点皮毛 UI 就可以提升不少身价…这些年过来,有无数的前端跨平台框架兴起。却只有 flutter 一家独秀,说明它还是有两把刷子的。今天这篇文章内容是基于 Mac 和 An...
dyld
+load 和 main() 谁先调用?有经验的 iOSer 们会毫不犹豫的回答出来是 load 方法,但为什么是 load 方法呢?今天我们来探讨一下底层的原理 新建一个项目,在 AppDelegate 里添加 load 方法,打上一个断点就会看到如下图所示的调用堆栈,如果觉得左侧太长了看不全,可以在控制台输入 bt 指令查看调用堆栈 从调用堆栈中我们可以看到,程序由 dyld 的 _...
Mach-O
通用二进制(Universal binary)文件macOS 系统一路走来,支持的 CPU 及硬件平台都有了很大的变化,从早期的 PowerPC 平台,到后来的 x86,再到现在主流的 arm、x86-64 平台。软件开发人员为了做到不同硬件平台的兼容性,如果需要为每一个平台编译一个可执行文件,这将是非常繁琐的。 为了解决软件在多个硬件平台上的兼容性问题,苹果开发了一个通用的二进制文件格式(...
代码注入
上一篇我们已经讲到使用 shell 脚本来重签并调试别人的 APP,那么我们又是重签又是附加调试别人的 APP 是为了啥呢?是太闲了吗,当然不是…我们接下来的任务就是代码注入 App 执行哪些代码?在开始代码注入之前,我们先了解一下一个 iOS 的 App 在运行的时候,究竟会执行哪些代码,以及我们从哪里入手注入代码 MachO。App 的二进制文件,我们写的所有代码都会在这里,后面的文章...
iOS 应用重签名
上一篇文章作者讲解了 iOS 应用签名的原理。理解了签名的流程之后,我们知道签名保证的是自签名之后原始数据没有被其他人篡改,我们的 App 在调试过程中每次安装到设备上都会签名,假设我们使用自己的配置文件和证书对他人的 App 进行签名,是不是就能冒充是我们自己开发的 APP 了? 是的。 如果你足够细心的话,在 Xcode 每次编译源码的时候,最后的几个步骤中就会看到签名过程: 由图中...
iOS 应用签名原理
要看懂这篇文章的前提条件: 对密码学有一个大概的了解,了解对称加密算法,非对称加密算法,哈希算法等知识。。。 这里简单介绍一下,也可以看作者之前发布的文章 密码学概述: 对称加密算法的加密和解密使用同一个密钥,速度快,效率高,适合处理大规模的数据。 非对称加密算法有一对公私钥,公钥加密的数据私钥可以解密,私钥加密的数据公钥可以解密。此算法速度慢,效率低,但安全性没得说,适合小规模的数据。...
密码学概述
密码学(来自希腊语kryptos,意思是隐藏)一词的核心是指使数据无法被窥探者读取的技术。当然,密码学也可以用于其他目的。密码学包括一系列技术,如验证数据的真实性(检测是否修改)、确定个人或其他实体的身份、确定谁发送了特定消息或创建了特定数据片段、通过网络安全地发送数据、用密码或口令安全地锁定文件等等。
MBProgressHUD源码解析
MBProgressHUD从入行以来,就经常听说,学习编程进步最快的方式,就是阅读优秀作品的源码… 那么,今天我来阅读一下MBProgressHUD这个库的源码… 查看一下文件,非常简单的俩个MBProgressHUD.h和MBProgressHUD.m文件 没什么说的,从MBProgressHUD.h文件开始看吧; 头文件首先声明了一个自定义的类 MBBackgroundView 和 一个...
记录一个报错
Undefined symbols for architecture arm64 上面这个报错经常会遇到…但是一直不知道是为啥出现的…今天碰巧知道了出现的原因 错误出现的步骤是这样的 首先我新建了 Director 和 ConcreteBuild 两个类 在 viewController.m 中我使用这两个类写了一些代码 这个时候我觉得这两个类写的不好不想要了,于是全部删除...
OC与iOS混编
记录一下,OC和Swift混编的问题在OC项目中,需要使用Swift的时候,一般情况下,在你的OC项目中新建一个Swift文件的时候,系统会自动提示你是否需要配置一个Objective-C桥接头文件,如下图
设计模式
#关于设计模式 * * 创建型 结构型 行为型 范围 类 Factory Method Adapter(类) InterpreterTemplate Method * 对象 Abstract FactoryBuilderPrototypeSingleton Adapter(对象)BridgeCompositeDecoratorFacadeFlyweightProxy Chai...
解决git clone速度慢的问题
之前一直以为是公司对网络的封锁,导致git clone速度慢,后来网上查找这个问题的时候得知不能怪公司,是因为咱们在这个局域网内…扯多了,回到正题,解决问题,由于我的是Mac电脑,我说的只针对Mac电脑 1. 进入终端命令行模式,输入sudo vim /etc/hosts 2. 输入i进入编辑模式,移动到最后一行准备输入3. 用浏览器访问 http://tool.chinaz.com 使用 ...
SDWebimage设置图片时URL不变,但图片改变的解决办法
本篇文章转载自[SDWebImage支持URL不变时更新图片内容](https://blog.csdn.net/xumugui007/article/details/51605546)基于这一现象,我们来进行分析。客户端第一次请求图片时,Charles抓包得知response header里有一个名为Last-Modified、数据是时间戳的键值对。
iPhoneX上pop回到根控制器上漂移的bug
记录一个在 iPhone X 上发生的诡异的 bug…语言怎么描述都太苍白,那么直接看图 只有在滑动到最底部的时候,push 到下一个页面,然后在 pop 回来就会出现 contentOffset.y 值自动偏移的现象… 视图的层次结构如图: 选中的视图控制器就是 TabBarController 的第二个子控制器,控制器的 view 就是一个 UICollectionView;我是...
记录一个pod install失败的解决方法
今天在网络看到一个 demo,想把它 clone 下来运行一下看看效果,大家都知道一般 clone 下来的项目需要使用 pod install 命令安装一下第三方库的,这个 demo 也不例外; 问题在于这个 demo 的 cocoapods 版本太低了(0.39.0)以至于 Podfile 中有些语法现如今都无法识别…以下截图是执行 pod install 命令之后给出了的错误提示: ...
Error Domain=NSURLErrorDomain Code=-999 已取消
今天遇到这么一个问题,在使用 SDWebimage 设置 UIImageView 的图片的时候,发现这个图片http://img4.imgtn.bdimg.com/it/u=132600321,3123081067&fm=27&gp=0.jpg怎么也设置不成功,后来调试一看发现 说是什么已取消,我是一脸懵逼啊,谁 TM 取消了啊???百思不得其解之后网上搜了一下; 嘿,还...
揭开神秘的iOS布局
翻译自: Demystifying iOS Layout 在你刚开始开发iOS应用时,最难避免或者说最难调试的是处理视图的布局和内容;通常这些事情的发生是因为对 视图更新 真实发生存在误解;了解 视图更新 的方式和时间需要更深入地了解iOS应用程序的主运行循环,以及它如何与UIView提供的某些方法关联;这篇博文将解释这些互动,希望澄清如何使用UIView的方法来获得你想要的行为; iOS应...