Category 的实现原理

graph TB
subgraph objc4
    subgraph objc-os.mm
        A[_objc_init]
        D[map_images_nolock]
    end
    subgraph objc-runtime-new.mm
        C[map_images]
        E[_read_images]
        F[load_categories_nolock]
        G[attachCategories]
    end
    subgraph objc-runtime-new.h
        H[attachLists]
        I[struct category_t]
    end
end
subgraph dyld
    B[_dyld_objc_notify_register]
end

A-->B
B-->C
C-->D
D-->E
E-->F
F-->G
G-->H

阅读全文 »

+load 方法的调用顺序?

  • 先调用类的 +load 方法;
    • 按照编译先后顺序 (Build Phases -> Compile Sources) 调用(先编译先调用);
    • 调用子类的 +load 方法会先调用父类的;
  • 然后调用分类的 +load 方法;
    • 按照编译先后顺序 (Build Phases -> Compile Sources) 调用(先编译先调用)。
阅读全文 »

KVO 的实现原理

以对 JQObject 对象的 foo 属性进行 KVO 监听为例:

  • KVO 会在运行时生成 NSKVONotifying_JQObject 类:

    • NSKVONotifying_JQObject 类继承自 JQObject
    • 并替换父类 JQObjectsetFoo: 方法实现为 (Foundation __NSSetXXXValueAndNotify) 其中 XXX 为监听属性类型;
    • 然后重写 class 方法,返回 JQObject
    • 重写 dealloc 方法,在对象销毁时做一些清理操作;
    • 重写 NSObject_isKVOA 方法,并返回 YES。
  • 将监听对象的 isa 指针指向 NSKVONotifying_JQObject 类对象;

  • 将监听对象的 superclass 指针指向 JQObject 对象;

阅读全文 »

一个 NSObject 对象占用多少内存?

objc4 源码

+ (id)alloc {
    return _objc_rootAlloc(self);
    }
    
// Base class implementation of +alloc. cls is not nil.
// Calls [cls allocWithZone:nil].
id
_objc_rootAlloc(Class cls)
{
    return callAlloc(cls, false/*checkNil*/, true/*allocWithZone*/);
}
阅读全文 »

Configure Language 指令

  1. shift + command 唤出 Command Palette
  2. 输入 Configure Language 确定
  3. 编辑 locale.json 文件
    {
        // 定义 VSCode 的显示语言。
        // 请参阅 https://go.microsoft.com/fwlink/?LinkId=761051,了解支持的语言列表。
        // 要更改值需要重启 VSCode。
        "locale":"en"
    }
    阅读全文 »

初始化一个新项目

$ yarn init

添加依赖包

$ yarn add [package]
$ yarn add [package]@[version]
$ yarn add [package]@[tag]
阅读全文 »