面试题集锦
iOS面试题及答案1
iOS面试题及答案2
iOS进阶面试题及答案3
一. CoreAnimation 相关
CABasicAnimation 资料
CoreAnimation(核心动画)概述
iOS面试题及答案2.5
NStimer准吗?谈谈你的看法?如果不准该怎样实现一个精确的NSTimer?
CoreGraphics(核心图形)
它是iOS的核心图形库,包含Quartz2D绘图API接口,常用的是point,size,rect等这些图形,都定义在这个框架中,类名以CG开头的都属于CoreGraphics框架,它提供的都是C语言函数接口,是可以在iOS和mac OS 通用的
QuartzCore
Quartz是位于Mac OS X的Drawin核心之上的绘图层,这个框架感觉不是很清晰,但是看头文件可以发现,它就是CoreAnimation,这个框架头文件只包含了
二. 第三方库
SDWebImage
Github详细资料
缓存策略
AFNetworking/ Alamorefire
三. 设计模式
1. MVC
2. MVVM
3. 单例
OC:
@implementation Singleton
+(Singleton *)shared{
static Singleton* instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [Singleton new];
});
return instance;
}
+(id) allocWithZone:(struct _NSZone *)zone
{
return [Singleton shareInstance] ;
}
-(id) copyWithZone:(NSZone *)zone
{
return [Singleton shareInstance] ;
}
-(id) mutablecopyWithZone:(NSZone *)zone
{
return [Singleton shareInstance] ;
}
Swift:
Class Singleton {
static let shared = Singleton()
private init() { }
}
4. 代理
5. 工厂模式
四. 消息传递
KVO
KVO(key-Value-Observing):键值观察机制 他提供了观察某一属性变化的方法,极大的简化了代码。基于runtime机制实现。
KVO只能被KVC触发,包括使用setValue:forKey:方法和点语法。
// 通过下方方法为属性添加KVO观察
- (void)addObserver:(NSObject *)observer
forKeyPath:(NSString *)keyPath
options:(NSKeyValueObservingOptions)options
context:(nullable void *)context;
// 当被观察的属性发送变化时,会自动触发下方方法
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context{}
KVC 和 KVO 的 keyPath 可以是属性、实例变量、成员变量。
KVC
KVC(Key-Value-Coding):键值编码 是一种通过字符串间接访问对象的方式(即给属性赋值)
举例说明:
stu.name = @"张三" // 点语法给属性赋值
[stu setValue:@"张三" forKey:@"name"]; // 通过字符串使用KVC方式给属性赋值
stu1.nameLabel.text = @"张三";
[stu1 setValue:@"张三" forKey:@"nameLabel.text"]; // 跨层赋值
当一个对象调用setValue方法时,方法内部会做以下操作:
1). 检查是否存在相应的key的set方法,如果存在,就调用set方法。
2). 如果set方法不存在,就会查找与key相同名称并且带下划线的成员变量,如果有,则直接给成员变量属性赋值。
3). 如果没有找到_key,就会查找相同名称的属性key,如果有就直接赋值。
4). 如果还没有找到,则调用valueForUndefinedKey:和setValue:forUndefinedKey:方法。
这些方法的默认实现都是抛出异常,我们可以根据需要重写它们。
通知
五. HTTP协议相关
六. WKWebView相关
1. 缓存
2. Cookie
七. 其它
1. ViewController生命周期
1. initWithCoder:通过nib文件初始化时触发。
2. awakeFromNib:nib文件被加载的时候,会发生一个awakeFromNib的消息到nib文件中的每个对象。
3. loadView:开始加载视图控制器自带的view。
4. viewDidLoad:视图控制器的view被加载完成。
5. viewWillAppear:视图控制器的view将要显示在window上。
6. updateViewConstraints:视图控制器的view开始更新AutoLayout约束。
7. viewWillLayoutSubviews:视图控制器的view将要更新内容视图的位置。
8. viewDidLayoutSubviews:视图控制器的view已经更新视图的位置。
9. viewDidAppear:视图控制器的view已经展示到window上。
10. viewWillDisappear:视图控制器的view将要从window上消失。
11. viewDidDisappear:视图控制器的view已经从window上消失。
2. 闭包的声明
属性声明
void(^propertyName)(void);
函数声明
- (void)function: callback: (ReturnTypeName(^)(TypeName *))handler;
3. Swift OC 混编
- OC引用Swift常见问题
@objc
4. 持续化存储
NSUserDefaults (偏好设置Preference) Preferences
NSUserDefaults适合存储轻量级的本地数据,支持的数据类型有:NSNumbe (NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL,NSData
NSUserDefault 本地保存的位置是Library/Preferences 这个目录下的 plist 文件。
使用偏好设置对数据进行保存之后, 它保存到系统的时间是不确定的,会在将来某一时间点自动将数据保存到Preferences文件夹下面,如果需要即刻将数据存储,可以使用[defaults synchronize]; 不可用自定义 因为是plistKeychain(钥匙串)
在Capabilities 中打开Keychain
引入Security 库
OSStatus SecItem 类增删改查文件沙盒 Documents等
主要存储非机密数据,大的数据,如图片。
存文件的操作步骤如下:
(1). 获得文件即将保存的路径
方法一:
NSArray *documentPaths =
NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask,YES);
NSString *ourDocumentPath =[documentPaths objectAtIndex:0];
方法二:
NSString *sandboxPath = NSHomeDirectory();
NSString *documentPath = [sandboxPath
stringByAppendingPathComponent:@"Documents"];
(2). 生成在该路径下的文件
NSString *FileName=[documentDirectory stringByAppendingPathComponent:fileName];//fileName就是保存文件的文件名
(3). 往文件中写入数据
[data writeToFile:FileName atomically:YES];//将NSData类型对象data写入文件,文件名为FileName
从沙盒中取出文件:
取就比较简单,只需下面一行代码!
NSData data=[NSData dataWithContentsOfFile:FileName options:0 error:NULL];
- plist存储 Documents
即属性列表文件,全名是Property List,这种文件的扩展名为.plist,因此,通常被叫做plist文件。它是一种用来存储串行化后的对象的文件,用于存储程序中经常用到且数据量小而不经常改动的数据。
可以存储的类型:NSNumber,NSString,NSDate,NSData ,NSArray,NSDictionary,BOOL.
不支持自定义对象的存储.
NSArray *sandBoxPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = [sandBoxPath objectAtIndex:0];
NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"myTestPlist.plist"];
NSLog(@"%@",plistPath);
- 归档 (NSKeyedArchiver) Cache
归档在iOS中是另一种形式的序列化,只要遵循了NSCoding协议的对象都可以通过它实现序列化。由于决大多数支持存储数据的Foundation和Cocoa Touch类都遵循了NSCoding协议,因此,对于大多数类来说,归档相对而言还是比较容易实现的。
对象归档后将得到一个后缀为.archive的文件,数据就保存在了这个文件中。
- 数据库
SQLite (CoreData FMDB)
Realm
路径 | 保存数据特点 | iTunes是否同步 |
---|---|---|
Document | 适合存储重要的数据 | 同步 |
Library/Caches | 体积大,不需要备份 | 不同步 |
Library/Preferences | 应用的设置信息 | 同步 |
tmp | 临时文件 | 不同步 |
5. UITableView初始化过程
1:询问分区个数 numberOfSection
2:询问每个分区的页眉和页脚的预估高度 estimatedSectionHeaderHeight/estimatedSectionFooterHeight
3:询问每个分区cell的个数 numberOfRows
4:询问每个分区cell的预估高度 estimatedRowHeight
5:询问每个分区cell的真实高度 rowHeight
6:询问每个分区cell的边距、样式、编辑状态
7:询问每个分区页脚的真实高度 heightForFooter
8:询问每个分区的cell(自定义cell)cellForRow
9:调用cell即将显示的方法 cellWillDisplay
10:询问每个分区页眉的真实高度 heightForHeader
11:询问每个分区页眉(自定义UIView)viewForSectionHeader
12:调用每个分区页眉即将出现的方法 sectionHeaderWillDisplay
13:询问每个分区页脚(自定义UIView)viewForSectionFooter
14:调用每个分区页脚即将出现的方法 sectionFooterWillDisplay