iOS 底层 通过KVO窥探Foundation框架 - AlvinSunny/OC-TheUnderlying GitHub Wiki

Foundation介绍

Foundation全称Foundation.framework, Foundation 和界面无关,也可以说和界面无关的类基本是Foundation框架的,和界面相关的是UIKit框架;同时Foundation是Cocoa框架的最重要最基础框架之一

将Foundation框架中的类进行逻辑分类如下:

  1. 值对象

  2. 集合

  3. 操作系统服务 包括下面三个:文件系统和URL进程间通讯。这个范畴中的大部分类代表不同的系统端口、套接字、和名字服务器,对实现底层的IPC很有用。NSPipe代表一个BSD管道,即一种进程间的单向通讯通道。线程和子任务。NSThread类使您可以创建多线程的程序,而各种锁(lock)类则为彼此竞争的线程在访问进程资源时提供各种控制机制。通过NSTask,您的程序可以分出一个子进程来执行其它工作或进行进度监控。

  4. 通知

  5. 归档和序列化

  6. 表达式和条件判断

  7. Objective-C语言服务

窥探Foundation框架中是否有_NSSetIntValueAndNotify()方法

前提条件:越狱iPhone手机一部、在Mac 下载 iFunBox 软件、一条iphone数据线

  1. 链接手机打开iFunBox选择文件系统-->System-->Library-->Caches-->com.apple.dyld-->dyld_shared_cache_arm64 (拷贝出来)

dyld_shared_cache_arm64就是IOS系统常用的框架包

  1. 执行命令 ./dsc_extractor dyld_cache_arm64 + 抽取出来的文件名 ,拿到抽取出来的文件通过-->System --> Library -->Frameworks --> Foundation.framework--> Foundation
  1. 拿到编译后的Foundation文件通过反编译工具 Hopper 进行反编译。

<1> 打开Hopper, 把Foundation拖拽到Hopper里,选择FAT archive (胖二进制文件)

<2> 反编译后可以看到相应的方法了,右侧会看到反汇编后的汇编,如果看不明白可以点击 “ if(b)f(x)”按钮 把汇编转为伪代码

  1. 在Hopper左侧搜索框中输入 _NSSetIntValueAndNotify() 方法进行搜索,查看实现代码

到这里大概可以看到_NSSetIntValueAndNotify()中调用了_changeValueForKey:key:key:usingBlock: 这样的方法,这就证明了Foundation框架中确实有_NSSetIntValueAndNotify()方法。