ios面试总结

UIView与CALayer的区别?

UIView继承于UIResponder->NSObject
CALayer继承于NSObject

UIView能够响应事件,CALayer不可以
UIView主要是对显示内容的管理而 CALayer 主要侧重显示内容的绘制。
在做 iOS 动画的时候,修改非 RootLayer的属性(譬如位置、背景色等)会默认产生隐式动画,而修改UIView则不会。
UIView与CALayer的区别

有关HTTP问题

HTTP:超文本传输协议,用户客户端与服务端的传输规则,可传输任意类型的数据
HTTP请求包含的要素:请求行,请求头,请求体,响应行,响应头,实体内容

请求行:POST /lyric/3g_lyric HTTP/1.1
请求行包含:请求方法,请求统一资源标识符URI,HTTP版本
请求方法:GET,POST,HEAD,PUT等
HTTP与服务器交互基本的方法有4种,GET,POST,PUT,DELETE
GET: 请求获取Request-URI所标识的资源
POST: 在Request-URI所标识的资源后附加新的数据
HEAD: 请求获取由Request-URI所标识的资源的响应消息报头
PUT: 请求服务器存储一个资源,并用Request-URI作为其标识
DELETE: 请求服务器删除Request-URI所标识的资源
TRACE: 请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT: 保留将来使用
OPTIONS: 请求查询服务器的性能,或者查询与资源相关的选项和需求

请求头:存放客户端给服务的的附加信息
Host:目标服务器的网络地址
Accept:让服务端知道客户端所能接受的数据类型 text/html
Content-Type:body中的数据类型,如application/json,charset=UTF-8
Accept-Encoding:客户端支持的数据压缩格式,如gzip
User-Agent:客户端的软件环境
Connection:keep-alive,HTTP1.1才开始有的,告诉服务端这是一个持久连接
Content-Length: body的长度,如果body为空则该字段值为0。一般POST请求中才会有
Cookie:记录着用户信息的保存在本地的数据

//添加请求头

[NSMutableURLRequest addValue: forHTTPHeaderField”];

//获取当前请求设置的field

[NSURLRequest allHTTPHeaderFields];

响应状态行:服务端返回给客户端的状态信息,包含HTTP版本号,状态码,状态码对应的英文名称

错误码分为以下几类:
1XX:信息提示。不代表成功或者失败,表示临时响应,100表示继续,101 表示切换协议
2XX:成功
3XX:重定向 304(NOT MODIFIED):该资源在上次请求之后无修改
4XX:客户端错误,404文件为找到,说明URI有问题,414URI太长, 403:无权限
5XX:服务器错误,504网关超时
http服务器常用状态码及其含义

HTTPS与HTTP的区别

一、https协议需要到ca申请证书,一般免费证书很少,需要交费。
二、http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
三、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
四、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

HTTP请求全过程

注:不知道抄的谁的了

Swift中Class和Struct区别?

类是引用类型,结构体是值类型。值类型在传递和赋值时将进行复制,而引用类型则只会使用引用对象的一个"指向"。所以他们两者之间的区别就是两个类型的区别。

classTemperature { 
    varvalue: Float = 37.0
}

classPerson {
    vartemp: Temperature? 
    func sick() {
         temp?.value = 41.0
    } 
}

let A = Person()
let B = Person()
let temp = Temperature() 
A.temp = temp 
B.temp = temp

由于 Temperature 是 class ,为引用类型,故 A 的 temp 和 B 的 temp指向同一个对象。A 的 temp修改了,B 的 temp 也随之修改。这样 A 和 B 的 temp 的值都被改成了41.0。如果将 Temperature 改为 struct,为值类型,则 A 的 temp 修改不影响 B 的 temp。

内存中,引用类型诸如类是在堆(heap)上,而值类型诸如结构体实在栈(stack)上进行存储和操作。相比于栈上的操作,堆上的操作更加复杂耗时,所以苹果官方推荐使用结构体,这样可以提高 App 运行的效率。

class有这几个功能struct没有的:

class可以继承,这样子类可以使用父类的特性和方法
类型转换可以在runtime的时候检查和解释一个实例的类型
可以用deinit来释放资源
一个类可以被多次引用

struct也有这样几个优势:

结构较小,适用于复制操作,相比于一个class的实例被多次引用更加安全。
无须担心内存memory leak或者多线程冲突问题

响应链和事件传递

事件的分发和传递。

1.当iOS程序中发生触摸事件后,系统会将事件加入到UIApplication管理的一个任务队列中
2.UIApplication将处于任务队列最前端的事件向下分发。即UIWindow。
3.UIWindow将事件向下分发,即UIView。
4.UIView首先看自己是否能处理事件,触摸点是否在自己身上。如果能,那么继续寻找子视图。
5.遍历子控件,重复以上两步。
6.如果没有找到,那么自己就是事件处理者。
7.如果自己不能处理,那么不做任何处理。
其中 UIView不接受事件处理的情况主要有以下三种
1)alpha <0.01
2)userInteractionEnabled = NO
3.hidden = YES.

怎么寻找最合适的view

// 此方法返回的View是本次点击事件需要的最佳View

  • (UIView)hitTest:(CGPoint)point withEvent:(UIEvent)event

// 判断一个点是否落在范围内

  • (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event

// 因为所有的视图类都是继承BaseView

  • (UIView)hitTest:(CGPoint)point withEvent:(UIEvent)event {
    // 1.判断当前控件能否接收事件
    if(self.userInteractionEnabled == NO || self.hidden == YES || self.alpha <= 0.01) return nil;
    // 2. 判断点在不在当前控件
    if([self pointInside:point withEvent:event] == NO) return nil;
    // 3.从后往前遍历自己的子控件
    NSInteger count = self.subviews.count;
    for(NSInteger i = count - 1; i >= 0; i--) {
    UIViewchildView = self.subviews[I];
    // 把当前控件上的坐标系转换成子控件上的坐标系
    CGPointchildP = [self convertPoint:point toView:childView];
    UIView
    fitView = [childView hitTest:childP withEvent:event];
    if(fitView) {
    // 寻找到最合适的view
    return fitView;
    }
    }
    // 循环结束,表示没有比自己更合适的view
    return self;
    }

响应者链

响应链是从最合适的view开始传递,处理事件传递给下一个响应者,响应者链的传递方法是事件传递的反方法,如果所有响应者都不处理事件,则事件被丢弃。我们通常用响应者链来获取上几级响应者,方法是UIResponder的nextResponder方法。

__weak,__block区别,及实现原理,为何__block修饰的值可以改变,__weak修饰的值不能改变?

__weak用于修饰变量,后者用户修饰属性,__weak主要用于防止block中的循环引用。
__block也用于修饰变量。它是引用修饰,其修饰的值是动态变化的,可以被重新赋值。
__block用于修饰block内部将要修改的外部变量。

使用__weak和__unsafe_unretained修饰符合一解决循环引用的问题,__weak会使block内部将指针变为弱指针。

__weak 和 __unsafe_unretained的区别。

__weak不会产生强引用,指向的对象销毁时,会自动将指针置为nil
__unsafe_unretained不会产生强引用,不安全,指向的对象销毁时,指针存储的地址值不变

__strong 和 __weak

在block内部重新使用__strong修饰self变量是为了在block内部有一个强指针指向weakSelf避免在block调用的时候weakSelf已经被销毁。

__block修饰的变量为什么能在block里面能改变其值?

__block用于解决block内部不能修改auto变量值的问题,__block不能修饰静态变量和全局变量
_block 所起到的作用就是只要观察到该变量被 block 所持有,就将“外部变量”在栈中的内存地址放到了堆中。进而在block内部也可以修改外部变量的值。

block本质

runtime如何实现weak变量的自动置nil?

runtime对注册的类, 会进行布局,对于weak对象会放入一个hash表中。 用weak指向的对象内存地址作为key,当此对象的引用计数为0的时候会dealloc.假如weak指向的对象内存地址是A,那么就会以A为键, 在这个weak表中搜索,找到所有以A为键的weak对象,从而设置为nil.

#import跟 #include 有什么区别,@class呢,#import<> 跟 #import””有什么区别?
1). #import是Objective-C导入头文件的关键字,#include是C/C++导入头文件的关键字,使用#import头文件会自动只导入一次,不会重复导入。
2). @class告诉编译器某个类的声明,当执行时,才去查看类的实现文件,可以解决头文件的相互包含。
3). #import<>用来包含系统的头文件,#import””用来包含用户头文件。

load方法和initalize方法有什么区别和共同点

initialize方法是在第一次调用该类的方法的时候调用,load方法是在程序启动之前就调用,父类先于子类执行,类先于分类执行。
总结:

1.load和initialize都会在实例化对象之前调用,以main函数为分水岭,前者是在main函数之前,后者是在main函数之后。

2.load和initialize方法都不会显示的调用父类的方法而是自动调用,即使子类没有initialize方法也会调用父类的方法,load方法不会调用父类。

3.load和initialize方法内部使用了锁,因此他们是线程安全的,实现时要尽可能简单,避免线程阻塞,不要再次使用锁。

4.load方法常用来method swizzle,initialize常常用于初始化全局变量和静态变量.

多线程

多线程传送门

不手动指定autoreleasepool的前提下,一个autorealese对象在什么时刻释放?

分两种情况:手动干预释放时机、系统自动去释放。

手动干预释放时机 - 指定autoreleasepool就是所谓的:当前作用域大括号结束时释放。
系统自动去释放 - 不手动指定autoreleasepool
Autorelease对象出了作用域之后,会被添加到最近一次创建的自动释放池中,并会在当前的 runloop 迭代结束时释放。
如果在一个vc的viewDidLoad中创建一个 Autorelease对象,那么该对象会在 viewDidAppear 方法执行前就被销毁了。
黑幕背后的autorelease

ios 用过哪些锁?哪些锁的性能比较高?

iOS中的锁

RunLoop和线程的关系?runloop的mode作用是什么?

一、RunLoop和线程的关系:

1.RunLoop 的作用就是来管理线程的,当线程的 RunLoop开启后,线程就会在执行完任务后,处于休眠状态,随时等待接受新的任务,而不是退出。

2.只有主线程的RunLoop是默认开启的,所以程序在开启后,会一直运行,不会退出。其他线程的RunLoop如果需要开启,就手动开启,

二、runloop内部是如何实现的:

1、有一个判断循环的条件,满足条件,就一直循环

2、线程得到唤醒事件被唤醒,事件处理完毕以后,回到睡眠状态,等待下次唤醒

二、runloop的mode作用是什么?:

1.model 主要是用来指定事件在运行循环中的优先级的,分为:

  • NSDefaultRunLoopMode(kCFRunLoopDefaultMode):默认,空闲状态
  • UITrackingRunLoopMode :ScrollView滑动时
  • UIInitializationRunLoopMode :启动时
  • NSRunLoopCommonModes(kCFRunLoopCommonModes):Mode集合

2.苹果公开提供的 Mode有两个:

  1. NSDefaultRunLoopMode(kCFRunLoopDefaultMode)
  2. NSRunLoopCommonModes(kCFRunLoopCommonModes)
    原文

(APP)进程间8中常用通信方式总结

https://blog.csdn.net/kuangdacaikuang/article/details/78891379

  • 1 URL Scheme
  • 2 Keychain
  • 3 UIPasteboard
  • 4 UIDocumentInteractionController
  • 5 local socket
  • 6 AirDrop
  • 7 UIActivityViewController
  • 8 App Groups

另附面试链接地址

iOS进阶面试题总结(一)
iOS进阶面试题总结(二)

你可能感兴趣的:(ios面试总结)