一。送分题
1.冒泡排序
二。拓展题
1.内存管理 侧重点是mrc下的内存管理机制
MRC,即Manual Reference Counting,在MRC下,我们根据对象的引用计数器来进行内存管理的.每个对象刚被创建的时候,默认的引用计数器为1,当引用计数器为0的时候,该对象就被销毁.我们可以把retain,alloc,new,copy看做是对引用计数+1操作,需要在适当的位置调用release或者autorelease使其-1保证没有内存泄漏. 内存管理的原则,谁创建,谁release;谁retain,谁release.
2.多线程 侧重点是gcd中同步异步还有queue的类型 dispatch_group
在线程中做线程安全用到的方式 同步锁等等
一、术语:同步、异步、并发、串行
1、同步和异步决定了要不要开启新的线程
同步:在当前线程执行,不开启新线程
dispatch_sync,同步操作,派发到任何队列,都不会开启新线程。
异步:在新的线程中执行任务,具备开启新线程的能力
dispatch_async,异步操作,会创建一个线程。如果派发到主线程中,则会在主线程中执行。
2、并发和串行决定了任务的执行方式
并发队列 :多个任务并发(同时)执行
串行队列 :一个任务执行完毕后,再执行下一个任务
特殊队列主队列 : 用来执行主线程上的操作任务
3.runloop 侧重点是runloop的几种类型以及与NSTimer的结合
4.跟音视频的结合,如何实现一个视频播放进度精准的播放时间显示?
- 视频时间戳
pts = inc++ *(1000/fps); 其中inc是一个静态的,初始值为0,每次打完时间戳inc加1.
在ffmpeg,中的代码为
pkt.pts= m_nVideoTimeStamp++ * (m_VCtx->time_base.num * 1000 / m_VCtx->time_base.den)
- 音频时间戳
pts = inc++ * (frame_size * 1000 / sample_rate)
在ffmpeg中的代码为
pkt.pts= m_nAudioTimeStamp++ * (m_ACtx->frame_size * 1000 / m_ACtx->sample_rate);
5.如何实现一个具有缓存上限、缓存清除的内存缓存模型
内存中缓存
内存中缓存时,使用一个NSMutabledictionary存储key-value值,
当,存缓存时,使用 setObject:forKey的方法存对象,读取时使用
objectForKey:读取对象
磁盘中缓存
内存中存储了一个key值的value之后,需要在磁盘中保存此份对象。首先将该对象通过归档转变成一个NSData,然后根据关键字创建磁盘中的文件,将该数据NSData写入该文件中即可。
对于在NSMutableiDictionary中未曾读到对象时,可以根据俄key索引本地磁盘,如果存在该文件,那么将该文件通过解档还原成对象,同时在NSMutabledictionary中存储一次该对象即可。
6.导致内存crash的问题都有哪些类型
一.访问了一个已经被释放的对象
二、访问数组类对象越界或插入了空对象
三、访问了不存在的方法
四、字节对齐
五、堆栈溢出
六、多线程并发操作
7.如何获取当前设备的帧率
CADisplayLink是一个定时器,是一个刷新频率和屏幕刷新率相同的定时器。
我们可以通过这个来计算当前帧数
8.如何监测当前页面的卡顿
主要思路:通过监测Runloop的kCFRunLoopAfterWaiting,用一个子线程去检查,一次循环是否时间太长。其中主要涉及到了runloop的原理。关于整个原理:深入理解RunLoop讲解的比较仔细。
三。技术题
1.Runtime里面,isa指针的指向问题?
IMP指针是指向实现函数的指针,通过SEL取得IMP,objc_msgSend来执行实现方法
2.Runtime里面SEL和IMP的区别是什么?
3.UITableView性能优化,尤其是滑动时,引申出GPU与CPU的一些讨论。
SEL:类成员的方法指针,不同于C中的函数指针,SEL只是一个编号。
IMP: 函数指针,指向我们定义的函数
4.UIView与CALayer的区别?
1.首先UIView可以响应事件,Layer不可以.
2.View和CALayer的Frame映射及View如何创建CALayer.
3.UIView主要是对显示内容的管理而 CALayer 主要侧重显示内容的绘制。
4.在做 iOS 动画的时候,修改非 RootLayer的属性(譬如位置、背景色等)会默认产生隐式动画,而修改UIView则不会。
5.RunLoop的几种Mode,子线程有runloop么?
3种
有
6.多线程的同步机制,GCD除了信号量,还有哪种同步机制。引申出dispatch_barrier_async。
我们使用GCD的时候如何让线程同步,目前我能想到的就三种
1.dispatch_group
2.dispatch_barrier
3.dispatch_semaphore
dispatch_group_async(group, queue, ^{
NSLog(@"%i",i);
sleep(2);
// 每次发送信号则semaphore会+1,
dispatch_semaphore_signal(semaphore);
});
7.NSTimer在不同runloop里面的作用?
NSTimer添加到Runloop中,但是不运行
在iOS多线程中,每一个线程都有一个Runloop,但是只有主线程的Runloop默认是打开的,其他子线程也就是我们创建的线程的Runloop默认是关闭的,需要我们手动运行。
我们可以通过[NSRunLoop currentRunLoop]来获得当前线程的Runloop,并且调用[runloop addTimer:timer forMode:NSDefaultRunLoopMode]方法将定时器添加到Runloop中,最后一定不要忘记调用Runloop的run方法将当前Runloop开启,否则NSTimer永远也不会运行。
8.触摸事件响应链和UIResponder
在使用App过程中,需要响应各种事件,在IOS中不是所有对象都可以响应事件,只有继承了UIResponder的对象才能接收并处理事件。我们称之为“响应者对象”,
UIApplication、UIViewController、UIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件
9.autorelease pool是什么?简述原理
10.KVO的内部实现?
kvo,全称Key-Value Observing,它提供了一种方法,当对象某个属性发生改变时,允许监听该属性值变化的对象可以接受到通知,然后通过kvo的方法响应一些操作。
在 Objective-C 中有两种使用键值观察的方式:手动或自动,此外还支持注册依赖键(即一个键依赖于其他键,其他键的变化也会作用到该键)
网友评论