struct categoryt { const char *name;/* 分类名称 */ classref t cls;/* 宿主类指针 */ struct methodlist t">
96SEO 2026-09-09 11:51 4

在编译阶段,Clang 并不会把 Category 的方法直接塞进原始类。而是打包成一个独立的 C 语言结构体
struct categoryt {
const char *name;/* 分类名称 */
classreft cls;/* 宿主类指针 */
struct methodlistt *instanceMethods;struct methodlistt *classMethods;struct protocollistt *protocols;struct propertylistt *instanceProperties;},
该结构体里 没有 ivar 字段——因为 Objective‑C 对象实例大小在编译期已固定,运行时无法安全地往对象里追加 ivar。
XCode 启动后dyld 把镜像映射到内存。接下来 Runtime 执行 _read_images. 当某个 Class 首次被引用或首次出现时会触发如下流程:
/* pseudo-code from objc4 / static void realizeClass { if ) { / 尚未实现化 / / Build internal structures…/ } / Attach categories registered for this host */ attachCategories;}
/* attach categories implementation simplified */ static void attachCategories { auto rw=cls->data;rw->methods.attachLists;rw->properties.attachLists;rw->protocols.attachLists;}
This is where a same-named selector defined in a Category actually wins over one defined in base class:
/* List insertion logic from objc4 / void ListArray::attachLists{ if){ memmove+cnt,array,array.sizesizeof);memcpy,added,cnt*sizeof);} }
| 步骤 | 效果 |
|---|---|
| 原始方法列表向后移动 | 保留旧有方法 |
| 新增的方法列表放置前面 | 优先匹配 |
| 消息调度使用二分查找 | 前面的方法更容易命中 |
若同一对象拥有多个 Categories 而且都提供相同 selector,则 后编译得到的方法拥有更高优先级
html
/* Attach categories reversed order */
int i=cats->count;while{
auto& e=cats->list;mlst=e.cat->methodsForMeta;if{ mlsts = mlst;}
}
由于不能给 Class 增加 ivar,所以 Properties 在 Categories 中通过关联对象实现:
/* Global association manager */ AssociationsManager manager;AssociationsHashMap& assocMap = manager.associations;
/* Key obfuscation */ disguisedptr dobj = DISGUISE;
/* Store key/value pair / auto& objAssocMap = assocMap;/ per-object map */ objAssocMap = ObjcAssociation;
/* On dealloc -> automatic cleanup / _object_remove_associations;/ releases value according to policy */
| Policy | Objective‑C Equivalent |
|---|---|
| OBJCASSOCIATIONASSIGN | assign / unsafe_unretained |
| OBJCASSOCIATIONRETAIN_NONATOMIC | strong |
| OBJCASSOCIATIONCOPY_NONATOMIC | copy |
| OBJCASSOCIATIONRETAIN | strong |
| OBJCASSOCIATIONCOPY | copy |
Key 冲突
错误 Policy 导致崩溃
线程安全顾虑
生命周期管理
当 dyld 把可执行文件或动态库映射至内存后会立即触发 _objc_init. 它向 dyld 注册回调,每当有新镜像加载就会执行:
void objcinit{ registerLoadImagesCallback;}
void load_images{/* …说起来,*/}
于是所有带有 /+load*/b> 的 Class 与 Category 都会提前跑完——这就是为什么你能看到「App 启动前就已经注入了某些 Hook」。
/* Preparation phase */ prepareloadmethods;
/* Call phase */ callloadmethods;
准备阶段收集所有需要跑 /+load*/b> 的对象,并把它们递归放入待执行数组;随后一次性循环消费这些数组并直接以函数指针形式调用:
cpp
这说明 /+load*/b> 不走消息发送机制 —— 更快、更可靠。
/+load*/b> 顺序。
只有当该 Class 或其任何子 Class 第一次收到消息(如 objc_msgSend) 时才会触发一次 /initialize*/b>。
父亲 初始化;若父亲已完成,它只会 返回而不会重复执行。话说回来,但若子亲自己也没有实现。则父亲的方法仍然会被递归调用——这就是为什么苹果官方建议:
objective-c
if {…} /* 防止多次触发父亲逻辑 */
相比 /+load*/b> 使用函数指针直接调,而 /initialize*/b> 则遵循标准消息发送方法。
– : 不继承;子班如果没写自己的,就不会去查找父亲。– : 会继承;若未重写则沿着继承链向上寻找并最终调用父亲版本。
| 属性 | =+'\x20\x20\x20\x20' Load | =+'\x20\x20\x20\x20' Initialize | |
|---|---|---|---|
| 调用时间 | 镜像加载前 | 第一次收到消息(懒加载) | |
| 调用方式 | 函数指针直接调用 | 消息发送 | |
| 是否继承 <-- 空格保持宽度 --> <-- 空格保持宽度 --> <-- 空格保持宽度 --> <-- 空格保持宽度 --> <-- 空格保持宽度 --> <-- 空格保持宽度 --> <-- 空格保持宽度 --> | |||
| ... | |||
| %-- 分析维度 %--% |
|---|
以下列出了最关键点,你可以快速检查自己是否满足常用方法:
| %== 方法特点 ==% | %== '+ load' ==% | %== '+ initialize' ==% |
|---|
希望能帮助你消除关于 iOS Runtime 中 “Category”的 “<+]”, “<+]”, “<+]” 和 “关联对象” 的疑问,也让你更清晰地掌握它们在项目中的实际影响和正确使用方式!
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback