目录
- UI视图相关
- 存储相关
- OC 语言特性相关
- Runtime相关
- 内存管理相关
- Block相关
- 多线程相关
- RunLoop相关
- 网络相关
- 设计模式相关
- 架构/框架相关
- 算法相关
UI视图相关
存储相关
Core Data
基于SQLite的封装
由三部分构成
NSManagedObject :基类和子类都是一张表,实例化的对象都一条数据
NSManagedObjectContext: 负责应用和数据库之间的交互
NSPersistentStoreCoordinator: 持久化存储协调者,主要用于协调托管对象上下文和持久化存储区之间的关系
多线程中NSManagedObjectContext不安全,需要一个线程一个NSManagedObjectContext,每个NSManagedObjectContext可以使用同一个NSPersistentStoreCoordinator实例,这是因为NSManagedObjectContext会在便用NSPersistentStoreCoordinator前上锁
Realm
Realm 于2014 年7月发布,是一个跨平台的移动数据库引擎,专门为移动应用的数据持久化而生。其目的是要取代 Core Data 和 SQLite。
数据迁移:我们在更新版本的时候都会修改版本号或者构建号,判断版本号或者构建号是不是之前的值,在(application:didFinishLaunchingWithOptions:)中进行配置
let bundleVersionString = Bundle.main.infoDictionary?["CFBundleVersion"] as! String
let bundleVersion = UInt64(bundleVersionString)!
let configuration = Realm.Configuration(schemaVersion: bundleVersion, migrationBlock: { (migration, oldSchemaVersion) in
print("Realm.Configuration", migration, oldSchemaVersion)
})
Realm.Configuration.defaultConfiguration = configuration
SQLite
编写SQL语句来操作原来表中的字段
增加表字段
ALTERTABLE 表名 ADDCOLUMN 字段名 字段类型;
删除表字段
ALTERTABLE 表名 DROPCOLUMN 字段名;
修改表字段
ALTERTABLE 表名 RENAMECOLUMN 旧字段名 TO 新字段名;
OC 语言特性相关
Runtime相关
你使用过Objective-C的运行时编程(Runtime Programming)么?如果使用过,你用它做了什么?你还能记得你所使用的相关的头文件或者某些方法的名称吗?
Objecitve-C的重要特性是Runtime(运行时),在#import <objc/runtime.h> 下能看到相关的方法,用过objc_getClass()和class_copyMethodList()获取过私有API;使用
Method method1 = class_getInstanceMethod(cls, sel1);
Method method2 = class_getInstanceMethod(cls, sel2);
method_exchangeImplementations(method1, method2);
代码交换两个方法,在写unit test时使用
OC优缺点
1、最大的优点是运行时特性
2、最大的不足是没有命名空间,但可以使用长命名与加特殊前缀的方式解决,对于引用的第三方库之间的命名冲突,可以使用link命令与flag来解决
KVO原理
Apple使用了isa混写(isa-swizzling)来实现KVO。当观察对象A时,KVO机制动态创建一个新的名为NSKVONotifying_A的新类,该类集成字对象A的本类,且KVO为NSKVONotifying_A重写观察属性的setter方法,setter方法会负责在调用元setter方法之前和之后,通知所有观察对象属性值的更改情况。(备注:isa混写(isa-swizzling)isa:is a kind of ; swizzling: 混合,搅合)
1、NSKVONotifying_A类剖析:在这个过程,被观察对象的isa指针从指向原来的A类,被KVO机制修改为指向系统创建的自雷NSKVONotifying_A类,来实现当前类属性值改变的监听;
所以当我们从应用层面来看,完全没有意识到有新的类出现,这是系统“隐瞒”了对KVO的底层想实现过程,让我们误以为还是原来的类。但是此时如果我们创建一个新的名为“NSKVONotifying_A”的类,就会发现系统运行到注册KVO的那段代码时程序就崩溃,因为系统在注册监听的时候动态创建了名为NSKVONotifying_A的中间类,并指向这个中间类了。
(isa指针的作用:每个对象都有isa指针,指向该对象的类,他告诉Runtime系统这个对象的类是什么。所以对象注册为观察者时,isa指针指向新子类,那么这个被观察的对象就神奇地变成新子类的对象(或实例)了。)因而在该对象上对setter的调用就会调用已重写的setter,从而激活键值通知机制。
2、子类setter方法剖析:KVO的键值观察通知依赖与NSObject的两个方法:willChangeValueForKey:和didChangeValueForKey:,在存取数值的前后分别调用2个方法:
被观察属性发生改变之前,willChangeValueForkey:被调用,通知系统该keyPath的属性值即将变更;当改变发生后,didChangeValueForkey:被调用,通知系统该keyPath的属性值已经变更;之后,observeValueForKey:ofObject:context:也会被调用。且重写观察属性的setter方法这种继承方式的注入是在运行时而不是编译时实现的。
KVO为子类的观察者属性重写调用存取方法的工作原理在代码中相当于:
-(void)setName:(NSString*)newName{
[selfwillChangeValueForKey:@"name"];
//KVO 在调用存取方法之前总调用
[supersetValue:newName forKey:@"name"];
//调用父类的存取方法
[selfdidChangeValueForKey:@"name"];
//KVO 在调用存取方法之后总调用
}
内存管理相关
Block相关
多线程相关
RunLoop相关
网络相关
设计模式相关
架构/框架相关
请设想和设计框架的public的API,并指出大概需要如何做、需要注意一些什么方面,来使别人容易地使用你的框架
1、抽象和封装,方便使用;
2、首先是对问题有充分的了解,比如说构建一个解压压缩框架,需要从使用者的角度出发,用户只需关注发送给解压框架一个请求,框架完成复杂的解压操作后,并在适当的时候通知到关注者,比如解压完成、解压出错等;
3、在框架内部去构建对象之间的关系,通过抽象使框架更加健壮、便于修改;
4、另外是api的说明文档。
网友评论