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)
}