求职笔记-iOS首

前言

现年新年求职时,整理、回顾了上学iOS开发以来获得的知识,此篇为就之记。

安插一段子我对面试的看法。
庄要当短短的多少个钟头外如详细摸底求职者,并且求职者可能远远超乎岗位要求,这多少个并无是相同件简单的工作。
求职分为几深片段:
1、简历筛选,去丢大部分无符合要求的;
2、笔试,去丢没有未雨绸缪的;
3、初面,去丢基础不扎实的;
4、复试,去丢综合力量欠缺的;
5、HR面,去丢三察不科学的;
在那一个进程中,一个吓之求职者会不断修改简历,已适应不同商家的求;提前整理、回顾基础知识,以承诺本着笔试及初试;针对过去之做事经验举行总计,不断增高自己之综合能力;并当生活及办事负,培养好的做事习惯和姿态
于这过程被,笔记就显示挺重点。

面试题

即时是面试的常问问题,仅供我们参考;
如若觉得行,不妨点个好

1、strong、weak、unsafe_unretained 这三个修饰符分别是什么?
2、performSelector为什么会内存泄漏?
3、如何对真机的crash日志进行分析?
4、对RunLoop的理解?
5、对象回收时Weak指针自动被置为nil的实现原理?
6、常见的持久化实现方法?
7、动画中的图层树、逻辑树、动画树、显示树分别是什么?
8、APP的生命周期(应用程序的状态)有哪些?
9、多线程中同步方式有哪些?
10、一个十级台阶,你在第一级台阶,每次能往上走一级或者两级台阶,问走到第十级台阶有多少种方案?

正文

以下是iOS相关的知识点。

怪和破获

1、try-catch

@try{
//raise exception
}
@catch (NSException *exception) {
// cannot raise exception
}
@finally {
// execute
}
// execute

2、捕获
NSSetUncaughtExceptionHandler

3、线上崩溃分析
每当方的捕获函数中,捕捉堆栈。
[NSThread callStackSymbols]

4、线及卡顿总计
CADisplayLink每帧回调,用时间隔算帧率;
算每一趟runloop的耗时。

UIWindow

UIWindow继承自UIView,是视图的容器。
貌似的app只待一个UIWindow,在AppDelegate中。
UIWindow的重中之重效用:

  • 当最顶层的视图容器,存放app的视图;
  • 传递触摸与键盘等事件;

KVO与Notification的异同

KVO和Notification本质都是观望者情势。
KVO是给观望者直接发消息(-willChange-didChange),耦合性较强,适合某些绑定,比如说界面上的进度漫长显示;
Notification是吃观察者发消息给NotificationCenter,再由NotificationCenter转发出去,耦合性较逊色,适合登录、等级变化、监听全局的某部属性变化;

Objective-C音机制的规律

先介绍Objective-C的近乎社团:

@interface NSObject <NSObject> {
    Class isa  OBJC_ISA_AVAILABILITY;
}
typedef struct objc_class *Class;

每一个OC对象本质上都是一个结构体,包括成员变量列表和分子方法列表,对象通过isa指针指向类;
好像精神上为是一个靶,是元类(meteClass)的实例,元类包括类形式的列表,类经过类似的isa指针指于元类;
有着的元类继承根元类,根元类isa指针指于自己;

objc_msgSend方法:objc_msgSend含两单必要参数:receiver、方法名(selector)
[receiver message];拿为移为:objc_msgSend(receiver, selector);
拉动参数的情状是:objc_msgSend(receiver, selector, arg1, arg2, …);

当于一个靶发送音讯不时,objc_msgSend道依照目的的isa指针找到对象的原来类,然后以接近的艺术列表中找selector;
假如搜索无交,通过Class super_class指南针找到父类,并当父类的办法列表查找,直到NSObject类;
查找到selector,objc_msgSend方法遵照章程列表的内存地址调用该兑现;
每个接近都起一个单身的缓存struct objc_cache *cache,缓存方法调用的结果。

靶回收时Weak指针自动为置为nil的兑现原理

Runtime维护着一个Weak表,用于存储指向某个对象的有Weak指针;
Weak表是Hash表,Key是所看重目的的地点,Value是Weak指针地址的数组;
于目的为回收的上,经过层层调用,会最终触发下边的道将有着Weak指针的值设为nil。

runtime源码,objc-weak.m 的 arr_clear_deallocating 函数。
Weak指针怎么着注册到Weak表中、咋样护hash表足参考objc-weak.m中之其余源码。

由落实着得看来,Weak指针的施用涉及到Hash表的增删改查,有自然之习性开销。
Weak指针的实际上使用:

iOS 8 特有iOS相关的漏洞
- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

iOS 8 的UIScrollView的delegate属性

持久化实现

ios中存储数据多就是是plist、sqlite和CoreData
(NSUserDefault其实也是plist)
广大的持久化实现:
1、实现NSCoding,配合runtime读取属性,再就此NSKeyedArchiver存储到文件中;
2、实现NSCoding,存储到NSUserDefault;
3、数据库,使用SQLitePersistentObjects写入db;
4、使用CoreData;

动画片性能优化

卡通的视图结构

视图树/图层树:UIView,每个view对应一个calayer,管理触摸、手势等相互事件;
模型树/逻辑树(目标帧) :CALayer –
modelLayer(),不关乎响应链(通过视图层级关系传递触摸事件的机制)
**呈现树/动画树(当前帧) **:presentationLayer(),
动画过程遭到之手上值
渲染树/显示树(下一帧)
:图层和卡通片打包提交到渲染服务后反而系列化所得养,被用来生成gl三角形

大规模的卡通片形式:

  • UIView blockAnimation
  • CAAnimation

动画片耗时在于:
图片加载、alpha透明、动画代码乱、离屏渲染、帧动画过多、布局统计、遮罩、图片过这一个;

一点问题不可制止,比如说图片加载、帧动画等,以下是团结总的片段更:

  • CADisplayLink控制帧动画的帧率,避免动画的绘图速率超越帧率

樂想想为啥?

  • 免使用alpha透明底图纸

  • 以GCD和CAAnimation来治本动画的流水线;

动NSOperationQueue或许也是解决方案。

  • 缩小遮罩以制止离屏渲染,制止光栅化视图的高频更新;
  • 利用代码布局,避免autolayout;

聊天室中UITableView的优化

聊天室中,消息的示应用的凡UITableView;
各一样漫长音信是单身的UITableViewCell,通过富文本展现聊天音讯,耗时操作是:富文本拼接、低度总结、滚动彰显;

优化两单地点:
作业方向:

  • 行文房间布置文件,房间分割普通、热闹、火爆等状态,某些情形下看略不必要之音信,再拓展发言等决定非常;
  • 消息合并,对同类型的信举行联合;

代码方向:

  • 富文本按照音信内容展开拼接后缓存;
  • 惊人在盘算了同样次等之后,同样缓存;(boundingRectWithSize
    可以提前统计发生惊人)
  • 基于帧率动态加载音讯数量,当举办音讯追赶的上,多修音信调用一浅insert,用CADisplayLink保证添加速率和帧率一致;
    代码成立cell
  • 图像预加载,程序于启动的当儿会开展人事版本同步,把红包图片预先下充斥好,在亮直接通过富文本举办图纸拼接;(为了制止锯齿,图像大小及展现应用整数)

TCP/IP

3次等握手-建立连接
1、A发送sync报文;seq=x Sync=1
2、B回复ack报文;seq=y Sync=1 ack=x+1
3、A回复ack报文;seq=x+1 Sync=1 ack=y+1

4不成握手-断开连接
1、A端发送FIN,截止发送报文;A进入FIN-WAIT
2、B端发送ACK,表示接到,继续发送报文; A收到报文进入FIN2-WAIT
3、B端发送FIN,停止发送报文;B进入CLOSE_WAIT
4、A端收到FIN,发送ACK报文,A进入TIME_WAIT状态

TIME_WAIT经过少个最好深报文段生存时间后,进入CLOSE状态。(假诺A在time_wait过程遭到,收到FIN报文,表示发送的ACK丢包了,重新作)

何以下载一个重特大的公文?援助断点续下、暂停、撤销的功效。

1、NSURLConnection / NSURLSessionTask
实现下载,通过Range字段实现断点续传;

存在的内存占用了多之题目。
化解方案:新建文件,然后据此NSOutputStream把下载的数据流直接append到文件被。

2、更简单的解决方案:NSURLSessionDownloadTask。

缺陷:下载完成以后才可以赢得完整的文本,如若以下载过程遭到一向关门退出程序,会丢掉数据,因为数量保存在内存;

断点续传

http实现断点续传的重中之重地点就是是在httprequest中入“Range”头。
Range头域可以请求实体的一个要么基本上个子范围。例如,

表示头500个字节:bytes=0-499
表示第二只500字节:bytes=500-999
意味着最终500个字节:bytes=-500
表示500字节以后的限量:bytes=500-

利用NSOutputStream写文件,在任务到位的代办方中,NSOutputStream关闭而清空,对应之task清空,对应之session清空;

NSURLRequest中来一个HTTPBodyStream,可以方便的承受服务器再次来到的流数据。

HTTP协议

http(超文本传输协议)是一个依据请求和响应情势之、无状态的、应用层的磋商,常因TCP的连续格局
http请求出于三局部构成,分别是:哀求行、音信报头、请求正文。
常见状态码:
200 成功
400 请求的语法错误
403 Forbidden
404 not found 服务器找不顶要的资源
408 Request Time out
500 服务器中错误

请求头
GET 请求方法、地址、协议版本
GET /foo.php?first_name=John&last_name=Doe&action=Submit HTTP/1.1

请求体(POST请求有)
form-data

NSURLRequest 的allHTTPHeader菲尔德s 可以看出以下属性

Cache-Control →no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection →keep-alive
Content-Encoding →gzip
Content-Type →text/html; charset=utf-8
Date →Fri, 10 Mar 2017 13:35:42 GMT
Expires →Thu, 19 Nov 1981 08:52:00 GMT
Pragma →no-cache
Server →nginx
Transfer-Encoding →chunked
X-Powered-By →PHP/5.4.16

HTTP响应否是出于五只片构成,分别是:状态行、音信报头、响应正文

HTTP/1.1 200 OK // 包含了HTTP协议版本、状态码、状态英文名称
Server: Apache-Coyote/1.1 // 服务器的类型
Content-Type: image/jpeg // 返回数据的类型
Content-Length: 56811 // 返回数据的长度
Date: Mon, 23 Jun 2014 12:54:52 GMT // 响应的时间

NSHTTPURLResponse的allHTTPHeaderFields 可以望以上属性

iOS目录结构

Documents 是常用文档目录,会跟iTunes同步;
Library 是资源库文件,里面有Caches和Preference两非凡目录;
Caches一般存放缓存文件,较充分;
Preference存放个人设置文件,iTunes会同步;
tmp 目录是临时文件,应用关闭后,可能碰面让删除。

协商文件夹,就离不起体系化。
NSKeyedArchiver
落实NSCoding协议即可兑现体系化;
配合运作时机制,能够动态实现将类的有着属性体系化。
相对应之,可以就此 NSKeyedUnarchiver 实现反系列化。

APP的生命周期

应用程序的状态

  • Not running未运行:程序尚未启动;
  • Inactive未激活:程序于前台运行,未收取及事件;
  • Active激活:程序在前台运行,接受到事件;
  • Backgroud后台:程序于后台运行,在后台停留一段时间后上挂于状态(Suspended),假设暴发乐、下载等特殊任务的次序可以老处在Backgroud状态;
  • Suspended挂于:程序于后台还无运行,当接到系统内存不足的warning时受免除出内存;

问题1:UIAlertView弹出底时光,APP处于哪一个状态?
不如电量指出弹出的下,APP又处在哪一个态?

Inactive和Background。

在加载到前台过程遭到,经历了Launch和Running两生状态;
start->main() -> UIApplicationMain() -> Load UI file ->
willFinishLaunchingWithOptions: -> Restore UI state -> didFinish
Active App => Application Become Active
接着就是不断开展RunLoop。
再有平等种植:加载应用程序到后台(在后台打开乐乎云音乐)
眼前的start部分雷同,但说到底进入的不是Foreground状态,而是Background状态;
于Background长日子不运行,会招应用程序进入Suspended状态;

线程安全题材

线程之间的资源共享,本质是本着同样对象、变量、文件等开展修改和访问,紧要出以下同步格局:

  • 加锁;
  • 原子操作;
  • sync代码块;

@synchronized( 同一对象){
  线程执行代码;
  }

NSOperationQueue 能够告一段落队列还未曾尽
suspended
可是无法住时操作。

RunLoop

此段,部分摘自文章

简简单单运行执行runlooprun函数并无会见为系统停住等待事件,而是需要在运行runloop此前增长source,唯有以暴发source的情状下线程才晤面截止下来监听各个风波。ios整个体系多是基于runloop这种架构的,ios程序的main线程全部达标啊是基于runloop的,各个风波的响应应该为是遵照source这种思路。
UIApplicationMain() 函数,那个方法会为main thread 设置一个NSRunLoop
对象;
Run loop同时也背autorelease pool的创始和刑满释放;
Run loop接收输入事件来星星种不同之自:输入源(input
source)和定时源(timer source);
首屈一指的子线程异步请求,需要敞开runLoop:AF 的 self.inputStream;
当当此外线程下边执行selector时,目的线程须有一个挪的run
loop。对于你创设的线程,这意味线程在公显式的起步run
loop在此之前是休会师举行selector方法的,而是径直处在休眠状态;
苹果不同意直接创建RunLoop,它只是供了少于个自动获得的函数:CFRunLoopGetMain() 和
CFRunLoopGetCurrent()。
一个 RunLoop 包含六个 Mode,每个 Mode 又含有几单
Source/提姆(Tim)er/Observer。

RunLoop 和 帧率之间的涉及
用户操作设备,相关的操作事件于系统生成并透过UI基特的指定端口分发。事件在
内部排成队列,一个个之分发至Main run loop
去开处理。UIApplication对象是第一独收到时间之对象,它控制事件怎么着吃拍卖。触摸事件分发至主窗口,窗口重新分发及对应出发触摸事件的
View。其他的波经过此外路线分发给任何对象变量做拍卖。
大多数之风波可以当公的利用里散发,类似于触摸事件,远程操控事件(线控耳麦等)
都是由app的 responder objects 对象处理的。Responder objects
在公的app里所在都是,比如:UIApplication 对象,view对象,view controller
对象,都是resopnder objects。大部分轩然大波的靶子还指定了resopnder
object,可是事件吧得传递让此外对象。比如,假诺view对象非处理事件,可以污染被父类view或者view
controller。

一个 RunLoop 包含两只 Mode,每个 Mode 又富含几独
Source/提姆er/Observer。每趟调用 RunLoop 的主函数时,只可以指定其中一个
Mode,这几个Mode被称之为 CurrentMode。假设要切换 Mode,只可以退
Loop,再重新指定一个 Mode 进入。这样做假设为着分隔开不同组的
Source/提姆(Tim)er/Observer,让这些相免影响。

main():
    file_fd = open ("logfile")
    x_fd = open_display ()
    construct_interface ()
    while changed_fds = select ({file_fd, x_fd}):
        if file_fd in changed_fds:
            data = read_from (file_fd)
            append_to_display (data)
            send_repaint_message ()
        if x_fd in changed_fds:
            process_x_messages ()

CFRunLoop源码

怎么着总括帧的持续时间:
故CACurrentMedia提姆(Tim)e()记录时时光,然后与上一帧记录的时光去比。得到实在的每帧持续的年华,然后代替硬编码的六分外之一秒,来更新UI。

总结

此篇的iOS知识点并无圆满,仅仅是谋事的有的记,后续随着写工作碰着的iOS相关问题,欢迎关注iOS开发小说

网站地图xml地图