今天有幸去某知名视频公司面试, 所以想用笔记下来整个过程, 方便自己对过往基础知识的回顾和收集2016年编程行业的面试题(貌似2016已经剩下0.5/12).
一进去二话不说肯定是做笔试, 这次笔试是英文版技术题目, 都是比较基础的东西, 不难.
接下来是两个技术大牛VS菜鸡的我. 问的问题我写在下文.有的我写了我的答案,有的由于篇幅和时间问题我就暂时先不写答案,有的我想过后专门写一个文章来聊聊.
我希望各位看官都能挑自己熟悉或者感兴趣的问题在评论里写上自己的答案. 因为每个人的语言组织和对一个问题的看法层面都不一样. 也欢迎纠正我的错误. 集思广益嘛.
UIView/runloop/runtime/动画/多线程/数据库
如何处理约束冲突问题?
答:
1.最普通的就是靠自己强大的逻辑能力来逐条约束检查,以及看一下报错信息, 报错信息那里会说到哪几个类(控件)的约束有问题.
2.巧用约束优先级priority. 当约束冲突时候系统会自动抛弃掉引起约束冲突的优先级比较低的那个约束来解决问题.所以我们逐个把约束的优先级设置低一些如998, 就可以排查出是哪个约束发生了冲突.
3.有时候明明检查了约束是没有问题的,却还是报了约束冲突的错误, 不妨把autoresizingMask这个属性设置为NO试一下, 可能有奇效.
当控件A相对于控件B添加了一个约束, 但是在程序运行过程中控件B会消失怎么办?
答:
这个需要根据需求文档来,既然可以知道控件B会消失, 那我的控件A可以不必相对于控件B来设计.
假如真的控件A必须相对控件B添加一个约束,而控件B可能消失, 那么我们可以给控件A再添加一个优先级比较低的约束,当相对于控件B的那条约束失效了之后, 就会执行这个优先级比较低的约束, 从而解决约束问题.
约束是怎么实现(添加)的?约束的优先级有几个等级?
答:
1.可以在storyboard或者xib里面直接添加,这样也是最直接方便的.
2.如果纯代码的话,可以使用友好度非常高的masonry框架.
约束是根据一个万能公式来实现的: y = m * x + b
x, y 代表view的attribute, attribute可以分为left right top bottom leading trailing width height centerX centerY baseline m 是倍数, 即multiplier b 常数, 即 constant.
每一条约束都代表着上面这个公式.masonry的语句也是根据这个公式来设计的,所以非常直观.
约束的优先级priority为0-1000直接, 0代表不会生效, 1000代表必须生效. 常用的等级有250(low), 750(high), 1000(required).
masonry里面有什么常用方法添加约束?如何进行约束更新?
答:
明白那个约束公式之后, masonry添加约束的语句非常通俗易懂, 如下
//y = m * x + d
[view mas_makeConstraints:^(MASConstraintMaker *make) {
make.xxx.equalTo(self.view).xxxxxxxx;
//更新约束
[self.view updateConstraintsIfNeeded];
//约束马上生效
[self.view layoutIfNeed];
}
约束更新:
在storyboard或者xib里面可以直接选update constraints来更新约束.
纯代码用masonry来进行约束更新的话, 需要调用父控件的两个方法(注意是父控件):1、updateConstraintsIfNeeded 2、layoutIfNeeded, 约束更新的内容需要写入mas_updateConstraints中.
在我说到用collectionView代替scrollView来优化离屏渲染问题时候(iOS10以后系统有属性可以优化了), 面试官问我什么是离屏渲染
答:
Off-Screen Rendering(离屏渲染), 顾名思义就是当view离开屏幕后还会被渲染.这涉及到GPU的屏幕渲染问题, 这样会消耗性能.
离屏渲染机制我也不是很懂, 可以参考以下链接
关于离屏渲染的研究
为什么tableView在滚动时候广告轮播图不轮播了? 怎么解决这个问题?
答:
这是由于runloop的模式问题.轮播图也就是定时器, 我们把定时器添加进runloop里面时候一般情况都是用NSDefaultRunLoopMode的, 而当tableView在滚动时候会切换成UITrackingRunLoop这个模式.所以在tableView在滚动时候定时器就会停止了工作. 解决办法就是我们在tableView里面创建定时器NSTimer时候把这个定时器的添加进runloop的模式设置成UITrackingRunLoopMode即可.
这里想在说两句NSTimer, NSTimer的创建方法有两种,如下:
//创建NSTimer方式一 创建timer并自动把它以默认的模式添加进runloop
// NSTimer *timer1 = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(doNothing) userInfo:nil repeats:nil];
//创建NSTimer方式二 创建timer但是不会帮我们加进runloop, 需要我们手动添加进runloop, 但是这样我们可以自己定义runloop模式
NSTimer *timer2 = [NSTimer timerWithTimeInterval:2 target:self selector:@selector(doNothingAgain) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer2 forMode:UITrackingRunLoopMode];
更多的NSTimer的知识可以参考:
NSTimer的使用
深拷贝和浅拷贝?
答:
浅拷贝就是只拷贝内存地址,让两个对象共用一个内存地址, 访问同一个内容, 这种类似我们桌面的快捷方式.
深拷贝就是拷贝内容,并且分配新的内存空间, 即两个对象内容一样,但是地址不一样, 这种类似我们把一个文件拉进U盘里面.
你谈一下runtime?什么时候用到?
答:
这个问题我想过后用一篇文章来聊聊.
你怎么做视频这个功能?
答:
以后用一篇文章来聊聊音视频问题.
你平时怎么做动画的
答:
动画分为UIView的动画和核心动画,还有一个比较常用的POP这个做动画的框架.
核心动画相对于UIView的动画来说会流畅一点.
UIView动画: 直接调用animation
[UIView animateWithDuration:2 animations:^{
/*
这里写要改变的frame或者约束等,来实现动画效果
*/
}
核心动画Core Animation: 这个我想有空用一篇文章来聊聊.
最简单的用CABasicAnimation/CAKeyframeAnimation这个类,三部曲完成简单动画(代码略)
1.创建动画 2.设置动画属性 3.把动画添加到layer中
POP框架: 这个开源框架是来自Facebook的动画引擎,它是独立于核心动画Core Animation的, 功能非常强大.该框架提供了API主要能处理4种动画效果:
1.普通变换 2.带有阻尼效果的 3.带有弹簧效果的 4.自定义动画
关于如何使用POP, 各位感兴趣的可以自己去搜一下.
很累, 今天先更到这, 古白.