iOS面试总结iOS面试题

iOS碎碎日常一题

2020-06-02  本文已影响0人  GitArtOS

1.iOS笔试题

  1. 介绍下内存的几大区域?
  2. 写一个”标准"宏MIN,这个宏输入两个参数并返回较小的一个。当你这样用时least = MIN(*p++, b);时会发生什么?
  3. 什么情况使用 weak 关键字,相比 assign 有什么不同?
  4. 一个objc对象的isa的指针指向什么?有什么作用?
  5. ViewController生命周期
  6. 如果页面A跳转到页面B,A的 viewDidDisappear 方法和B的 viewDidAppear 方法哪个先调用?
  7. 下面的代码输出什么?
@implementation Son : Father
- (id)init {
    if (self = [super init]) {
        NSLog(@"%@", NSStringFromClass([self class])); 
        NSLog(@"%@", NSStringFromClass([super class])); 
    }
    return self;
}
@end

8.以下代码运行结果如何?

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"1");
    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"2");
    });
    NSLog(@"3");
 }

9.单例的优点和弊端?
10.runloop 和线程有什么关系?
11.http和scoket通信的区别。

2.iOS笔试题答案

1. 介绍下内存的几大区域?

2. 写一个”标准"宏MIN,这个宏输入两个参数并返回较小的一个。当你这样用时least = MIN(*p++, b);时会发生什么?

答案:

#define MIN(A,B) ((A) <= (B) ? (A) : (B))
((*p++) <= (b) ? (*p++) : (*p++))
//这个表达式会产生副作用,指针p会做三次++自增操作。

3. 什么情况使用 weak 关键字,相比 assign 有什么不同?

4. 一个objc对象的isa的指针指向什么?有什么作用?

答:指向他的类对象,从而可以找到对象上的方法。

5. 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上消失。

6. 如果页面A跳转到页面B,A的 viewDidDisappear 方法和B的 viewDidAppear 方法哪个先调用?

1.A -->viewWillDisappear
2.B-->viewWillAppear
3.A-->viewDidDisappear
4.B-->viewDidAppear

7. 下面的代码输出什么?

@implementation Son : Father
- (id)init {
    if (self = [super init]) {
        NSLog(@"%@", NSStringFromClass([self class])); // Son
        NSLog(@"%@", NSStringFromClass([super class])); // Son
    }
    return self;
}
@end

答案:Son Son
解析:
self 是类的隐藏参数,指向当前调用方法的这个类的实例。<br />
super是一个Magic Keyword,它本质是一个编译器标示符,和self是指向的同一个消息接收者。
不同的是:super会告诉编译器,调用class这个方法时,要去父类的方法,而不是本类里的。
上面的例子不管调用[self class]还是[super class],接受消息的对象都是当前 Son *obj 这个对象。

8. 以下代码运行结果如何?

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"1");
    dispatch_sync(dispatch_get_main_queue(), ^{
        NSLog(@"2");
    });
    NSLog(@"3");
 }

// 只输出:1。(主线程死锁)

9. 单例的优点和弊端?

10. runloop 和线程有什么关系?

runloop与线程是一一对应的,一个runloop对应一个核心的线程,为什么说是核心的,是因为runloop是可以嵌套的,但是核心的只能有一个,他们的关系保存在一个全局的字典里。
runloop是来管理线程的,当线程的runloop被开启后,线程会在执行完任务后进入休眠状态,有了任务就会被唤醒去执行任务。
runloop在第一次获取时被创建,在线程结束时被销毁。
对于主线程来说,runloop在程序一启动就默认创建好了。
对于子线程来说,runloop是懒加载的,只有当我们使用的时候才会创建,所以在子线程用定时器要注意:确保子线程的runloop被创建,不然定时器不会回调。

11. http和scoket通信的区别。

答:

上一篇 下一篇

猜你喜欢

热点阅读