iOS面试必刷基础题知识点
2021-03-18 本文已影响0人
Lee坚武
1.内存管理
在iOS中,使用 “引用计数” 来管理OC对象的内存
新创建的OC对象,引用计数是1;
调用retain会让OC对象的引用计数+1,调用release会让OC对象的引用计数-1
当引用计数减为0,OC对象就会销毁,释放占用的内存空间
当调用 alloc、new、copy、mutableCopy 方法返回了一个对象,在不需要这个对象时,要调用release或者aoturelease释放
2.深拷贝与浅拷贝
copy:浅拷贝,不拷贝对象本身,仅仅是拷贝指向对象的指针。
mutableCopy:深拷贝,是直接拷贝整个对象内存到另一块内存中。
浅拷贝,不拷贝对象本身,仅仅是拷贝指向对象的指针。深拷贝,是直接拷贝整个对象内存到另一块内存中。
用copy修饰的 或者赋值的 变量肯定是不可变的。
用copy赋值,要看源对象是否是可变的,来决定只拷贝指针,还是也拷贝对象到另一块内存空间
对象之间mutableCopy赋值,肯定会拷贝整个对象内存到另一块内存中
对象之间赋值之后,再改变,遵循互不影响的原则
准则:不可变对象的copy方法是浅拷贝,其余都是深拷贝🚩🚩🚩🚩🚩
3.weak指针实现原理
weak表示的是一个弱引用,这个引用不会增加对象的引用计数,并且在所指向的对象被释放之后,weak指针会被设置的为nil。weak引用通常是用于处理循环引用的问题。
所引用对象的计数器不会+1,并在引用对象被释放的时候自动被设置为nil
通常用于解决循环引用问题
4.Copy、Strong、Weak、Assign的区别?
assign
- 用于对基本数据类型进行赋值操作,不更改引用计数
- 也可以用来修饰对象,但是被assign修饰的对象在释放后,指针的地址还是存在的,指针并没有被置为nil,成为野指针
- 之所以可以修饰基本数据类型,因为基本数据类型一般分配在栈上,栈的内存会由系统自动处理,不会造成野指针。
weak:
- 修饰Object类型,修饰的对象在释放后,指针地址会被置为nil,是一种弱引用
- 在ARC环境下,为避免循环引用,往往会把delegate属性用weak修饰
- weak和strong不同的是:当一个对象不再有strong类型的指针指向它的时候,它就会被释放,即使还有weak型指针指向它,那么这些weak型指针也将被清除。
strong:
- ARC下的strong等同于MRC下的retain都会把对象引用计数加1
copy:
- 会在内存里拷贝一份对象,两个指针指向不同的内存地址。
- 一般用来修饰NSString等有对应可变类型的对象,因为他们有可能和对应的可变类型(NSMutableString)之间进行赋值操作,为确保可变对象变化时,对象中的字符串不被修改 ,应该在设置属性时拷贝一份。
- 而若用strong修饰,如果可变对象变化,对象中的字符串属性也会跟着变化。
5.进程和线程的区别
- 一个线程只能属于一个进程.
- 一个进程可以有多个线程,但至少有一个线程。
- 线程是操作系统可识别的最小执行和调度单位。
6.有哪些情况会出现内存泄漏
- block循环引用
- delegate循环引用问题
- NSTimer循环引用
- 地图类处理
- 线程保活target:self
7.Scoket连接和HTTP连接的区别
- HTTP协议是基于TCP连接的,是应用层协议,主要解决如何包装数据。Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。
- HTTP连接:短连接,客户端向服务器发送一次请求,服务器响应后连接断开,节省资源。服务器不能主动给客户端响应,iPhone主要使用类NSURLConnection
- Socket连接:长连接,客户端跟服务器端直接使用Socket进行连接,没有规定连接后断开,因此客户端和服务器段保持连接通道,双方可以主动发送数据
8.HTTP协议的特点,关于HTTP请求GET和POST的区别
特点:
- HTTP超文本传输协议,是短连接,是客户端主动发送请求,服务器做出响应,服务器响应之后,链接断开
- HTTP是一个属于应用层面向对象的协议,HTTP有两类报文:请求报文和响应报文
- HTTP请求报文:一个HTTP请求报文由请求行、请求头部、空行和请求数据4部分组成
- HTTP响应报文:由三部分组成:状态行、消息报头、响应正文
GET请求
- 参数在地址后拼接,不安全(因为所有参数都拼接在地址后面)
- 不适合传输大量数据(长度有限制,为1024个字节)
POST请求
- 参数在请求数据区放着,相对GET请求更安全
- 数据大小理论上没有限制
- 提交的数据放置在HTTP包的包体中
9.包体积优化
安装包瘦身(ipa):资源文件、可执行文件
资源文件(图片、音频、视频等)
- 采取无损压缩(使用工具)
- 去除没有用到的资源(https://github.com/tinymind/LSUnusedResources)
可执行文件瘦身:
- 编译器优化(Xcode相关配置)
- 利用AppCode(https://www.jetbrains.com/objc/)检测未使用的代码:菜单栏 -> Code -> Inspect Code
- 生成LinkMap,可以查看可执行文件的具体组成
- 可借助第三方工具解析LinkMap文件:http://github.com/huanxsd/LinkMap
10.nil、Nil、NULL、NSNull的区别
- nil:指向一个对象的空指针
- Nil:指向一个类的空指针,
- NULL:指向其他类型(如:基本类型、C类型)的空指针, 用于对非对象指针赋空值.
- NSNull:在集合对象中,表示空值的对象.
11.assign weak retain strong copy关键字的区别
- assign:用于对基本数据类型进行赋值操作,不更改引用计数。也可以用来修饰对象,但是,被assign修饰的对象在释放后,指针的地址还是存在的,也就是说指针并没有被置为nil,成为野指针。如果后续在分配对象到堆上的某块内存时,正好分到这块地址,程序就会crash。之所以可以修饰基本数据类型,因为基本数据类型一般分配在栈上,栈的内存会由系统自动处理,不会造成野指针。
weak:修饰Object类型,修饰的对象在释放后,指针地址会被置为nil,是一种弱引用。在ARC环境下,为避免循环引用,往往会把delegate属性用weak修饰;在MRC下使用assign修饰。weak和strong不同的是:当一个对象不再有strong类型的指针指向它的时候,它就会被释放,即使还有weak型指针指向它,那么这些weak型指针也将被清除。
ARC下的strong等同于MRC下的retain都会把对象引用计数加1。
copy:会在内存里拷贝一份对象,两个指针指向不同的内存地址。一般用来修饰NSString等有对应可变类型的对象,因为他们有可能和对应的可变类型(NSMutableString)之间进行赋值操作,为确保可变对象变化时,对象中的字符串不被修改 ,应该在设置属性时拷贝一份。而若用strong修饰,如果可变对象变化,对象中的字符串属性也会跟着变化
__weak:只在ARC中使用,只能修饰对象,不能修饰基本数据类型(int、bool)。
同时,在ARC下,要避免block出现循环引用,经常会:__weak typedof(self) weakSelf = self;
12.iOS ViewController生命周期
- 1.viewDidLoad
- 2. viewWillAppear
- 3. viewDidAppear
- 4. viewWillDisappear
- 5. viewDidDisappear
- 6. dealloc
13.iOS import,include,class, #import ""和#import <>的区别
#import "" 表示引用本地文件// 自己创建
#import <> 表示引用库文件 // 系统文件
#import可以自动防止重复导入
导入objective c的头文件时用#import,包含c/c++头文件时用#include。
include和import的作用一样的,主要区别在于使用import可以直接避免重复引用,include需要手动处理重复引用。
14.iOS有哪些常用的设计模式
- 1. 单例模式
- 保证一个类仅有一个实例,并提供一个访问它的全局访问点。
- 2. 代理模式
- 给某一个对象提供一个代理,并由代理对象来控制对原对象的访问。
- 3. 观察者模式
- 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。
- 4. 工厂方法模式
- 定义创建对象的接口,让子类决定实例化哪一个类。工厂方法使得类的实例化延迟到其子类。