学习笔记16-Header Map、反射、Swinject、Realm

161 阅读3分钟

Header Map

iOS 的 Header Map 是一个编译器使用的文件,它将头文件的名称映射到它们在文件系统中的具体位置。这帮助编译器快速定位头文件,从而提高编译效率。Header Map 通常由构建系统自动管理,无需开发者手动创建和维护。

在 Static Library 的情况下,开启 Use Header Map 选项,Pod 组件的头文件会被设置为 Project 类型。这里的 hmap 的 Key 为 ClassA.h,只能以 #import "ClassA.h" 的方式引入 hmap 才有效。

当我们以 #import <Pod/ClassA.h> 这种标准方式引入头文件时,并不会命中 hmap。

优化方案是,基于 Gemfile/Podfile 插件,以 组件名/头文件名 作为 Key,生成基于 CocoaPods 规则下的 hmap。

反射

在编程中,反射(Reflection)是指程序在运行时能够查看和修改自身结构的能力。Objective-C 是一种支持反射的编程语言,它的反射机制主要基于 NSObject 类的一些方法和 runtime 的功能。

  • 类和对象的信息查询:class, superclass, isMemberOfClass:, isKindOfClass:
  • 属性和变量的访问: valueForKey:, setValue:forKey:, valueForKeyPath:, setValue:forKeyPath:
  • 方法调用: performSelector
  • 运行时类型信息: objc_getClass, objc_lookUpClass, class_getName, class_getSuperclass
  • 动态创建对象和类: alloc, init, objc_allocateClassPair, class_addMethod, class_addIvar
  • 获取和修改成员变量: ivar_getName, ivar_getTypeEncoding, object_getIvar, object_setIvar
  • 方法交换: method swizzling

Swinject

依赖注入(Dependency Injection,DI)是一种设计模式,用于实现代码的解耦合和模块化。根据注入的方式和时机分为不同类型:构造器注入,属性注入,方法注入,服务定位器模式(Service Locator Pattern),接口注入

Swinject 是 iOS 的一个轻量级且易于使用的依赖注入框架。Swinject 使用一个中心化的容器来管理对象的生命周期和依赖关系,从而实现了代码的解耦和模块化。 要使用 Swinject,你需要按照以下步骤进行操作:

  • pod 'Swinject'
  • 创建一个 Swinject 容器,这个容器将负责解析和提供依赖
  • 定义依赖关系,调用 register 注册依赖
  • 解析依赖,使用 resolve 方法来获取需要的依赖
  • 使用依赖

Realm

对象关系映射(Object-Relational Mapping,简称 ORM)是一种软件技术,它允许开发者将对象模型映射到关系数据库模型上。

Realm 是移动数据库框架,提供了对象关系映射(ORM)的方式,允许开发者以类似使用本地对象的方式操作数据库。

Realm 的主要特点包括:模型驱动、自动迁移、轻量级、实时同步和跨平台支持。

Realm 简单示例如下:

// Define your models like regular Swift classes
class Dog: Object {
    @Persisted var name: String
    @Persisted var age: Int
}
class Person: Object {
    @Persisted(primaryKey: true) var _id: String
    @Persisted var name: String
    @Persisted var age: Int
    // Create relationships by pointing an Object field to another Class
    @Persisted var dogs: List<Dog>
}
// Use them like regular Swift objects
let dog = Dog()
dog.name = "Rex"
dog.age = 1
print("name of dog: \(dog.name)")

// Get the default Realm
let realm = try! Realm()
// Persist your data easily with a write transaction 
try! realm.write {
    realm.add(dog)
}

参考文档