美文网首页
AZ基础面试总结-iOS

AZ基础面试总结-iOS

作者: Dezi | 来源:发表于2020-06-24 23:41 被阅读0次

再接再厉,增强总结和表达能力!!!

1. static关键字

  • static修饰局部变量,通过static修饰的函数或者变量,作用域仅限于当前文件,其它文件不可访问。
  • 类方法不可以访问实例变量(函数),但是通过static修饰的可以被类方法访问
  • static修饰的变量,能且只能被初始化一次

static修饰全局变量是不安全的,因为它可能会被外部修改,所以在定义全局变量时推荐使用extern关键字修饰。

引申extern关键字:

  • extern修饰全局变量,也称之为外部变量,是在方法外部定义的变量。它不属于哪个方法,而是属于整个源程序。
  • 作用域是整个源程序。
  • 如果全局变量和局部变量重名,则在局部变量作用域内,全局变量被屏蔽,不起作用。编程时候尽量不使用全局变量。

2. http和https

3. TCP和UDP

4. 三次握手和四次挥手

5. OSI七层模型和TCP/IP五层模型(详细整理一下)

      1. 5.四道题整理的iOS网络相关答案

6. 进程和线程,线程之间是如何通信的,线程的几种状态

进程 是资源分配的基本单位,它是程序执行时的一个实例,在程序运行时创建。
线程 是程序执行的最小单位,是进程的一个执行流,一个进程由多个线程组成。

线程间通信的体现
1). 把1个线程传递数据给另1个线程
2). 在1个线程中执行完特定任务后,转到另1个线程继续执行任务

线程间通信常用方法
例:用GCD将一个线程的数据传递给另一个线程

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    NSLog(@"donwload---%@", [NSThread currentThread]);
    // 1.子线程下载图片
    NSURL *url = [NSURL URLWithString:@"http://test.png"];
    NSData *data = [NSData dataWithContentsOfURL:url];
    UIImage *image = [UIImage imageWithData:data];
    // 2.回到主线程设置图片
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"setting---%@ %@", [NSThread currentThread], image);
    });
});

线程的几种状态
1.线程的创建 alloc
2.线程的启动 start
3.线程的运行/阻塞 sleep
4.线程的死亡(线程的任务结束、发生异常、强制退出)
5.强制停止线程 exit

7. weak作用及其实现原理

weak关键字的作用是弱引用,所引用对象的计数器不会加一,并在对象作用域外自动被设置为nil。

weak底层实现原理:

  • 当一个对象objweak指针指向时,这个weak指针会被存储到以obj作为keyweak_table散列表上对应的一个weak指针数组里面。
  • key是对象地址,valueweak指针数组
  • 当一个对象obj的dealloc方法被调用时,Runtime会以objkey,从sideTableweak_table散列表中,找出对应的weak指针列表,然后将里面的weak指针逐个置为nil。

8. 响应链原理

当用户触摸屏幕时,触碰屏幕产生事件UIEvent并存入UIApplication中的事件队列中,在整个视图结构中自上而下的进行分发:UIApplication -> UIWindow -> UIViewController -> self.view -> subview

比较重要的两个方法:

   // 判断当前点击事件是否存在最优响应者(First Responder)
   - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
   // 判断当前点击是否在控件的Bounds之内
   - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event;
  • 第一个方法返回一个可以响应event触摸事件的UIView
  • 第二个方法判断触摸点在不在可响应范围之内。

9. App启动过程

main函数执行前:
1.加载可执行文件(App里的所有.o文件)
2.加载动态链接库,进行rebase指针调整和bind符号绑定。
3.ObjC的runtime初始化。 包括:ObjC相关Class的注册、category注册、selector唯一性检查等。
4.初始化。包括:执行+load()方法、用attribute((constructor))修饰的函数的调用、创建C++静态全局变量等。

main函数执行后:
5.从main函数到设置self.window.rootViewController执行完成
6.首屏初始化

10. 冒泡排序,快速排序,二分法排序的复杂度

冒泡排序时间复杂度O(n^2)
快速排序时间复杂度O(nlogn)
二分法排序时间复杂度O(logn)

11. 手写冒泡排序

var arr: [Int] = [2,4,3,1,6,8,10,7,5,9]
for i in 0..<arr.count {
    for j in 0..<(arr.count-i-1) {
        if (array[j] > array[j+1]) {
            let temp = arr[j]
            arr[j] = arr[j+1]
            arr[j+1] = temp
        }
    }
}
for i in 0..<array.count {
    print(array[i])
}

相关文章

网友评论

      本文标题:AZ基础面试总结-iOS

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