iOS 面试题及答案

面试题集锦

iOS面试题及答案1
iOS面试题及答案2
iOS进阶面试题及答案3

一. CoreAnimation 相关

CABasicAnimation 资料
CoreAnimation(核心动画)概述

iOS面试题及答案2.5
NStimer准吗?谈谈你的看法?如果不准该怎样实现一个精确的NSTimer?

动画定时器——CADisplayLink

CoreGraphics(核心图形)

它是iOS的核心图形库,包含Quartz2D绘图API接口,常用的是point,size,rect等这些图形,都定义在这个框架中,类名以CG开头的都属于CoreGraphics框架,它提供的都是C语言函数接口,是可以在iOS和mac OS 通用的

QuartzCore

Quartz是位于Mac OS X的Drawin核心之上的绘图层,这个框架感觉不是很清晰,但是看头文件可以发现,它就是CoreAnimation,这个框架头文件只包含了

二. 第三方库

SDWebImage

Github详细资料
缓存策略

AFNetworking/ Alamorefire

Github详细资料

三. 设计模式

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协议相关

详细基础资料

iOS 面试题及答案_第1张图片
三次握手

iOS 面试题及答案_第2张图片
四次握手

六. 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 混编
  1. OC引用Swift常见问题
    @objc
4. 持续化存储
  1. NSUserDefaults (偏好设置Preference) Preferences
    NSUserDefaults适合存储轻量级的本地数据,支持的数据类型有:NSNumbe (NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL,NSData
    NSUserDefault 本地保存的位置是Library/Preferences 这个目录下的 plist 文件。
    使用偏好设置对数据进行保存之后, 它保存到系统的时间是不确定的,会在将来某一时间点自动将数据保存到Preferences文件夹下面,如果需要即刻将数据存储,可以使用[defaults synchronize]; 不可用自定义 因为是plist

  2. Keychain(钥匙串)
    在Capabilities 中打开Keychain
    引入Security 库
    OSStatus SecItem 类增删改查

  3. 文件沙盒 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];
  1. 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);

  1. 归档 (NSKeyedArchiver) Cache
    归档在iOS中是另一种形式的序列化,只要遵循了NSCoding协议的对象都可以通过它实现序列化。由于决大多数支持存储数据的Foundation和Cocoa Touch类都遵循了NSCoding协议,因此,对于大多数类来说,归档相对而言还是比较容易实现的。
    对象归档后将得到一个后缀为.archive的文件,数据就保存在了这个文件中。
  1. 数据库
    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

你可能感兴趣的:(iOS 面试题及答案)