iOS面试题汇总

本文详细介绍了iOS应用沙盒的概念及其目录结构,包括Documents、Library/Caches等重要目录的用途,并深入探讨了iOS多线程的实现方式及优缺点。此外,还涉及了Block的使用技巧及内存管理等内容。

沙盒的目录结构

这里写图片描述

iOS应用沙盒即文件系统目录,与其他应用的文件系统隔离

Documents:保存应用运行时生成的需要持久化的数据,如游戏进度、涂鸦软件的绘图等信息, 该目录会被iTunes同步备份。

Library/Caches:保存应用运行时生成的需要持久化的数据,iTunes同步设备时不会备份该目录。一般存储体积大、不需要备份的非重要数据,如缓存图片或者离线数据(地图等)。

Library/Preference:保存应用的所有偏好设置,iOS的Settings(设置)应用会在该目录中查找应用的设置信息。iTunes同步设备时会备份该目录。

tmp:保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时不会备份该目录。重新手机、系统磁盘不足时都会被清理

内存中的区域划分

栈区(stack):由系统自动分配和释放,存放局部变量的值,容量小速度快,有序
堆:一般由程序员分配和释放,如果不释放,则出现内存泄露。程序会回收您的内存,特点:容量大,速度慢,无序
静态存储区:全局变量(外部变量)和静态变量都存放在静态区域。当程序结束使,系统回收
常量区:存放常量的内存区域,程序结束时,系统回收
代码区:存放二进制代码的区域

iOS的远程推送

(1) 应用程序安装后提示用户是否需要接收推送,用户确认后注册消息推送。
(2)App接收到从APNS Server获取的令牌信息;
(3)APP将令牌信息发送到自己的服务器端;
(4)当需要向用户推送消息时,自己的服务器将向苹果的推送通知服务器(Apple Push Notification Service,以下简称 APNS)发送通知;
(5)APNS 会向装有此APP的iPhone设备发送消息

理解Block的使用

Block为什么要用copy
a、block在创建的时候默认分配的内存是在栈上,而不是在堆上。这样的话其本身的作用域是属于创建时候的作用域,一旦在创建的作用域之外调用就会导致程序的崩溃。所以使用了copy将其拷贝到堆内存上。
b、block创建在栈上,而block的代码中可能会用到本地的一些变量,只有将其拷贝到堆上,才能用这些变量

Block为什么不用retain
retain这是增加了一次计数,block的内存还是在栈上,并没有存在堆上,存在栈上的block可能随时被系统回收。

为什么进入block中的对象引用计数需要自动加1
Block执行的是回调,因此block并不知道其中的对象obj创建后会在什么时候被释放,为了不在block使用obj之前,对象已经被释放,block就retain了obj一次

block和函数的关系
Block的使用很像函数指针,不过与函数最大的不同是Block可以访问函数以外、词法作用域以内的外部变量的值。
换句话说,Block不仅 实现函数的功能,还能携带函数的执行环境。

对于block的理解
block实际上是: 指向结构体的指针
编译器会将block的内部代码生成对应的函数

Block中self的循环引用
block默认创建在栈上,所以对要对其进行执行copy操作,将其拷贝到堆区,便于更好的操作对象。但是执行了copy操作之后,block中使用self,此对象会被retain一次(注意:block在堆区上时才会起到retain作用),会造成循环引用。
解决方法:
在MRC下,使用__block修饰
在ARC下,使用__unsafe_unretained\weak修饰

总结:block可以理解为指向结构体的指针,编译器会把block的代码默认生成其对应的函数。因为block创建时是在栈上,因此需要使用copy进行修饰,使其copy到堆上,方便操作其对象。因为block是回调,我们不知道其对象将会在什么时候被释放掉,所以block会自动将其对象reatin一次,使其引用计数加1,避免在使用其对象前,就被释放掉的尴尬场景。需要注意的是,在block内部使用self修饰对象,会使其reatin一次,造成循环引用,解决方案是MRC下使用__block进行修饰 ARC下使用__unsafe_unretained或者__weak修饰。

循环引用出现的三种情况

NSTimer
NSTimer对象timer作为一个对象A的属性,本意在A的dealloc中释放timer,但是timer没有停止就不会触发dealloc,然后就互相等待,造成循环引用。解决方法是显式的调用timer的关闭方法[timer invaluate],再释放A对象

Block
block代码块没有配合weak使用

Delegate
声明delegate时请用assign(MRC)或者weak(ARC)。

理解iOS中的多线程

多线程是针对于单核的CPU来设计的,目的是为了让CPU快速在多个线程之间进行调度。

多线程的优缺点
优点:提高程序的执行效率
缺点:开启线程需要一定的内存空间

同步和异步:决定了可不可以开启新的线程
同步:在当前线程中执行任务,不具备开启新线程的能力
异步:在新的线程中执行任务,具备开启新线程的能力

并行与串行:决定了任务的执行方式
并行:多个任务并发(同时)执行。类型迅雷,多个任务同时开启下载
串行:一个任务执行完毕后,再执行下一个任务。类似浏览器的一个接一个下载

iOS应用程序中都是一个主线程,也成为UI线程
那么主线程的作用就是用来更新UI,显示或者刷新界面
注意:不能将耗时的任务放在主线程上,否则会出现卡顿的现象。

NSThread
直接操作线程对象,但需要手动管理生命周期,而且经常使用这种方式来查看当前线程

GCD(Grand Central Dispatch)
底层使用的是C语言,灵活方便,可以根据系统负荷来增减线程,性能效率更好

Cocoa NSOperation
NSOperation对GCD的封装,使用起来更好理解,将任务封装为NSOpertaion,添加到NSOPerationQueue对象中。子类化NSOpertaion的设计,更具有面向对象(封装,复用)的特性。更加适合在复杂项目中使用

进程与线程
Progress和Thread,进程和线程是操作系统里的基本概念
线程与进程的区别:
线程是资源分配的最小单位,也是处理器调度的基本单位,但是进程不是
进程是资源拥有的单位,同一个进程内的线程共享进程里的资源
多进程,允许多个任务同时运行
多线程,允许单个任务分为不同的部分运行

一个对象被创建需要的三个步骤

开辟内存空间
初始化参数
返回内存地址值

常见的Http状态码有哪些?

302是请求重定向。
500及以上是服务器错误,如503表示服务器找不到、3840表示服务器返回无效JSON。
400及以上是请求链接错误或者找不到服务器,如常见的404。
200及以上是正确,如常见的是200表示请求正常。

iOS数据持久化方式

plist文件
NSKeyedArchiver归档
preference(偏好设置)
SQLite 3(第三方FMDB对其封装)
CoreData

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值