iOS面试

作者: 灰斗儿 | 来源:发表于2020-02-19 03:17 被阅读0次

目录

  • 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的说明文档。

算法相关

相关文章

网友评论

      本文标题:iOS面试

      本文链接:https://www.haomeiwen.com/subject/rejwfhtx.html