面试题



一。送分题

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.跟音视频的结合,如何实现一个视频播放进度精准的播放时间显示?

  1. 视频时间戳
    pts = inc++ *(1000/fps); 其中inc是一个静态的,初始值为0,每次打完时间戳inc加1.
    在ffmpeg,中的代码为
    pkt.pts= m_nVideoTimeStamp++ * (m_VCtx->time_base.num * 1000 / m_VCtx->time_base.den)
  1. 音频时间戳
    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 中有两种使用键值观察的方式:手动或自动,此外还支持注册依赖键(即一个键依赖于其他键,其他键的变化也会作用到该键)

你可能感兴趣的:(面试题)