【2018最新】iOS面试题(二)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaozhuanddapang/article/details/79643062

1.VC的生命周期
init:初始化程序
loadView:视图初始化
viewDidLoad:视图加载完成
viewWillAppear:视图即将显示
viewDidAppear:视图显示时调用
viewWillDisappear:视图即将消失
viewDidDisappear:视图消失时调用

2.assign 和weak的区别
weak所有权修饰符表明该属性定义了一种非拥有关系,为这种属性设置新值时,既不保留新值,也不释放旧值。weak修饰的属性所指向的对象销毁以后,属性会自动置为nil,assign的特质与weak类似,但是assign修饰的属性所指向的对象销毁以后,不会自动置为nil。
assign可以修饰非OC对象,weak只能用来修饰OC对象。

3.冒泡排序的时间复杂度
冒泡排序:

NSMutableArray *arrs = [NSMutableArray arrayWithObjects:@"17",@"23",@"11",@"47", nil];
    for (int i = 0; i < arrs.count-1; i++) {
        for (int j = 0; j < arrs.count-1-i; j++) {
            if ([arrs[j] intValue] > [arrs[j+1] intValue]) {
                int tmp = [arrs[j] intValue];
                arrs[j] = arrs[j+1];
                arrs[j+1] = [NSString stringWithFormat:@"%d",tmp];
         }
    }
}

冒泡排序时间复杂度:O(n^2) —O(n的2次方)
冒泡排序空间复杂度:O(1)

时间复杂度:执行这个算法需要消耗的时间
①用常数1代替算法中的所有加法常数
sum = n*(n+1)/2;
该算法的时间复杂度为O(1)
②修改后的运行次数中只保留最高阶项

for (int i = 1; i < n; i++) {
    x += i;
}

for (int i = 1; i < n; i++) {
    for (int j = 1; j < n; j++) {
        x += i+j;
    }
}

第一个for循环的时间复杂度为O(n),第二个for循环的时间复杂度为O(n^2),整个算法的时间复杂度为O(n)+O(n^2)=O(n^2)。

③去除最高阶项的系数

for (int i = 1; i < 3n; i++) {
    for (int j = 1; j < n; j++) {
        x += i+j;
    }
}

O(3n*n)=O(n^2)

④指数阶

int i = 1,n = 100;
while (i<n) {
    i = i*2;
}

该算法的执行次数为x, 2^x = n,x = log2n,时间复杂度为O(log2n)

空间复杂度:执行算法需要占用的内存空间
当一个算法的空间复杂度为一个常量,即不随被处理数据量n的大小而改变时,可表示为O(1);当一个算法的空间复杂度与以2为底的n的对数成正比时,可表示为O(10g2n);当一个算法的空I司复杂度与n成线性比例关系时,可表示为O(n)

4.static和define的区别
define定义的常量没有类型,static定义的常量有类型,在定义常量的时候,尽量使用static+const的方式

5.视频用的基础框架
本地和网络流媒体音频视频播放:AVFoundation、MediaPlayer
VLC框架本地和网络流媒体音频视频播放:MobileVLCKit、

6.afn底层原理
AFN是对苹果的NSURLSession网络框架进行的封装,AFN分为六个部分:
①通过AFSecurityPolicy实现安全策略,AFSecurityPolicy提供了三个安全策略,分别为无校验、公钥校验、证书校验

②AFNetworkReachabilityManager提供了四种枚举类型,实现对当前网络状态的判断,分别为未知网络、断网、流量、wifi,当网络状态发生变化时,通过block进行回调

③通过AFURLRequestSerialization将数据发送给服务器,AFURLRequestSerialization中我们经常用到的有三个部分:AFURLRequestSerialization协议返回一个序列化请求;AFHTTPRequestSerializer初始化请求类、对序列化参数编码、创建请求缓存策略、进行超时设置等;AFJSONRequestSerializer用来处理json类型请求

④通过AFURLResponseSerialization实现对服务器响应的处理,AFURLResponseSerialization中我们经常用到的有五个部分:AFURLResponseerialization协议返回一个序列化响应;AFHTTPResponseSerializer初始化响应类、设置可接收的Content-Type类型;AFJSONResponseSerializer校验并解码json类型的响应;AFXMLParserResponseSerializer校验并解码xml类型的响应;AFImageResponseSerializer校验并解码UIImage类型的响应。

⑤通过AFURLSessionManager创建不同类型的网络请求会话、设置网络请求的回响

⑥AFHTTPSessionManager根据不同需求,创建所需的GET、HEAD、POST、PUT、PATCH、DELETE方法

7.sd缓存原理
(今天公司组织去看厉害了我的国纪录片,明天再发,好久不看了,还得现看一下)

8.简单说一下链表
链表中的元素在内存中不是连续放置的,链表有不同的类型,分为单向链表和双向链表。单向链表中一个节点只有链向下一个节点的链接,而在双向链表中,链接是双向的,一个链向下一个元素,另一个链向前一个元素。

9.KVC、KVO原理
KVO的原理:当观察对象B时,KVO会通过OC的runtime动态创建一个对象B当前类的子类,并为这个新的子类重写被观察属性的setter方法,setter方法随后负责通知观察对象属性的改变状况。KVO是通过setter方法实现的,需要使用self.来修改属性对象的成员变量才会有效,直接通过成员变量赋值不会触发KVO机制

KVC的原理:当一个对象调用setValue方法时,方法内部会做以下操作
①检查是否存在相应的key的set方法,如果存在,就调用set方法
②如果set方法不存在,就会查找与key相同并且带下划线的成员变量,如果有,则直接给成员变量属性赋值
③如果没有找到_key,就会查找相同名称的属性key,如果有就直接赋值
④如果还没有找到,则调用valueForUndefinedKey和setValue:forUndefinedKey方法

10.手写单例

static XMSecureManager *shareManager;
static dispatch_once_t once;

dispatch_once(&once,^{
    shareManager = [[self alloc] init];
});

return shareManager;

猜你喜欢

转载自blog.csdn.net/xiaozhuanddapang/article/details/79643062