[大三iOS实习生面试]—过程+面试知识点

在追求别人认可之前,先追求那些能得到别人认可所需的品质。

过程

楼主最近向Airbnb和字节跳动iOS实习岗投递了简历,很荣幸的获得了他们的笔试面试机会,最后虽然没有能够得到offer,有遗憾,但也获得了很多经验,在此分享出来。

由于具体笔试项目有保密要求,就不好意思透露具体的项目内容了。大概说来,是一个相对全面的项目,给你三天时间。考察了网络接口,界面UI和一些常用的控件。总之,如果进行过一次比较完整的项目开发,这个任务难度相对不是那么大。如果没有开发过项目,努力的话,应该也能完成基本要求。

提交过笔试后,顺利进入进入下一轮面试。

其实比较遗憾的是,因为Airbnb这次面试,是我第一次面试。不知道准备什么,邮件说的是一些开发的常识。我就自负地认为,仗着自己平常开发iOS的经验,应该可以应付得了。可是,面试完那个面试我的哥哥对我说:

“保持联系,后面HR还会联系你”

然后加了一句,

“可能,HR还会联系你”

其实到此我也知道凉了。

具体原因:我平常开发的时候,虽然一方面努力实现功能与设计效果,另一方面也努力去追求优化。但是,部分停留在了我知道该这样写代码,而对底层原因分析详细。这是一个缺憾,当我学c++的时候,我会去研究底层一点的问题,但我没用它去进行应用开发。而我学oc的时候,努力去利用它实现功能。但忽视了代码的深入理解。其实,一个优秀的程序猿。越了解程序代码实现的底层,越能够写出效率高,bug少的代码。

在这次面试收到打击之后,我在网上搜了搜,发现

面试的题目,网上都有啊😢

因此我决定,我就从这些面试题目出发,认真的把iOS的知识看了一遍。虽然不是那么系统,但可以把自己开发过程中遇到的一些疑惑以及自己学的一些知识联系起来。在学习的过程中发现很多问题,我面试没答出来真的很可惜。其实相关的知识都了解,就差那点破了。

复习完之后,想再拼一次。也检验自己一次。于是投了字节跳动的iOS实习岗位。反馈很快,第一天投递,第二天HR联系我准备一面,第三天一面。

两次面试情况对比

复习前:

Airbnb面试官:在使用block的时候,会不会出现循环引用的问题?
我内心:

  • 循环引用,好像在利用引用计数的内存机制里会导致内存泄漏
  • block,里面用self会报错哎。我每次开发都得在外面用声明一个weak self。

会不会有关,要不猜一下?算了,不会就不会。


我说:“不知道哎”

复习后:

字节跳动面试官:在使用block的时候,会不会出现循环引用的问题?
我内心:


12738065-329b7a8873720b63.png

我回答:“这个要看情况,对于一般的block。用clang –rewrite-objc源代码文件,将代码转为c++(实际是c代码),可以看到block是一个结构体,他会将全局变量保存为一个属性(__strong的),而self通过可能通过某条路径,强引用了block,这是就会就会造成循环引用。然后内存无法自动回收。使用系统自带的UIView的block,因为是类方法,不是全局变量,self对block没有强引用,就不会造成循环引用。此外GCD(多线程)以及NSURLSession的block不会造成循环引用。”
面试官:“这你都知道🧐”。

我复习的OC知识点

Strong & Weak

ARC未来简化程序员对内存的管理,推出了一套内存管理机制,对象的申请和释放工作会在运行时,由编译器自动添加retain和release

强指针Strong:

被strong修饰的属性一般不会被自动释放,OC中,对象默认是强指针,在实际开发过程中对象也一般用strong来修饰,懒加载的控件一般用strong来修饰。

弱指针Weak:

在使用Storyboard或者xib给控件拖线的时候,拖出来的属性是weak修饰。因为,添加空间的时候,编译器添加子视图是添加到view上面,而[self.view addSubView]会对添加到控件进行强引用,如果再用strong对添加到子控件进行修饰的话,相当于有两条强指针对子控件进行了强引用。

除此,我们用代理的时候,用weak进行修饰,为了防止控件的循环引用。

iOS开发中 Strong 和 weak 的深入理解

循环引用:

两个与多个对象之间,都是强引用,且对象之间的引用形成了一个环状结构,导致对象无法释放,造成内存泄漏。

block循环引用:循环引用通常是block引起的
12738065-539039169820dd5c.png

12738065-0838e4cead3d4ab0.png

用clang –rewrite-objc源代码文件,将代码转为c++(实际是c代码),可以看到block是一个结构体,他会将全局变量保存为一个属性(__strong的),而self通过tableview,cell强引用了block就会造成循环引用。

OC中Block使用了__weak和__strong依然不会循环引用原因

解决方法:


12738065-25afe95e2824e2c9.png

使用系统自带的UIView的block,因为是类方法,不是全局变量,self对block没有强引用,就不会造成循环引用。

还有GCD(多线程)以及NSURLSession的block不会造成循环引用。

12738065-db5643f735012b05.png

OC 循环引用(Retain Cycle)

提高tableView的性能

UITableView的性能优化,提升列表滚动的流畅性

1、 使用相同的cell时候,通过单元格ID标示该cell,每次使用的时候就可以重用。其次,定义多个cell时候,也尽量放在一个nib文件里。

2、 当有加载图片的时候,不要同步直接加载。那样会十分卡顿。解决方法:1、缓存加载的图片。2、可以在滑动过程中,进行异步预加载。

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

3、图片显示的时候,最好imageview大小比例与图片相当,避免过多的裁剪缩放。

4、减少subview的层级,少用透明图层,和重叠图层。

copy与mutableCopy

copy是浅拷贝,生存一个指向原对象的指针。如NSString,则这个对象不能改变。而mutablCopy是深拷贝,是在内存另外开辟一段空间,获得一个数据与原对象一样的对象。是可以改变的。

属性中的copy,retain,assign

OC中属性关键字(retain, assign, copy...)

在iOS中关于深拷贝和浅拷贝以及copy属性的理解

assign:简单赋值,不更改索引计数,当属性为基础数据类型和C数据类型的时候使用。

copy:建立一个索引计数为1的对象,然后释放旧对象。这样无论传入的是一个可变对象还是不可变对象,本身持有的就是一个不可变副本。如果使用如strong,传入的对象被改变后,就会相应被改变。

retain:释放旧对象,将旧对象赋值予输入对象,在将输入对象的索引计数++

oc atomic与nonatomic

[OC]之 atomic 与 nonatomic的区别

区别:在属性的set,get方法里用了互斥锁。

atomic能够保证读写互斥,但不能说是线程安全的。因为比如当有很多对象要对atomic的属性进行修改的时候,他们会排队等待信号量。如果前面的某个对象在读写之后释放了该属性的对象,后面排队的对象就找不到对象,程序崩溃。

OC category 与extension

OC中Category和Extension以及继承的用法和区别

category:利用oc的动态运行时机制,可以对一个类的功能进行拓展,包括NSString,Button等。运行时决议的,所以对象内存布局已经确定,如果添加实例变量会破坏类的内部布局。

extension:编译时决议,与h文件的@interface与m文件的@implement一起形成一个完整的类,随着类的消失而消失。

OC单例:一个类仅有一个实例,并且自行实例化向整个系统提供。

iOS中的单例你用对了么?

view与layer的区别

1、 直观上,view可以处理事件,比如触摸事件等。layer 不可以。

2、 CALayer为UIVIew在背后提供内容绘制和显示。

autoLayout & autoSize

iOS Autolayout 介绍

为了对不同大小,分辨率的屏幕进行显示适配。比如可以设置align来规定靠近父view的边多少px。

controller的生命周期

ViewController的生命周期分析和使用

12738065-ae95392b7c1d90d8.png

当你alloc并init了一个ViewController时,这个ViewController应该是还没有创建view的。ViewController的view是使用了lazyInit方式创建,就是说你调用的view属性的getter:[self view]。在getter里会先判断view是否创建,如果没有创建,那么会调用loadView来创建view。loadView完成时会继续调用viewDidLoad。loadView和viewDidLoad的一个区别就是:loadView时还没有view。而viewDidLoad时view以及创建好了。
当view被添加其他view中之前时,会调用viewWillAppear,而之后会调用viewDidAppear。
当view从其他view中移出之前时,会调用viewWillDisAppear,而之后会调用viewDidDisappear。
当view不在使用,而且是disappeared,受到内存警告时,那么viewController会将view释放并将其指向nil。

总结

面试

1、一定得做充足的准备,说白了。面试其实也是考试,对付考试最好的方法,还是我们熟悉的应试教育方法。网上有很多经验可循。这不是说,只需要应试就可以了。没有平常的积累,是很难快速看懂所要准备的知识的。
2、不要回答不知道,而是尽自己所能回答。就算搭错也不要紧。其实大部分时候,听到题目心里冒出的第一想法,已然靠近正确答案了。
3、自信,当然这是建立在良好准备的基础上的。🤓

发展

1、无论是求学还是求职,基础是最重要的。不仅仅是编程基础,还有计算机基础如计算机组成原理,操作系统,计算机网络等。这些能决定我们最终能走多远。
2、无论做什么类型程序猿,算法功底一定要好。
3、平时编码过程中,每实现一个需求,解决一个bug。要弄清深层次的原因,这样不仅能让我们对这项技术更加熟悉,说不定还能联系到其他课程的知识,增强基础。
4、利用好每一段经历,其实这一次的求职虽然失败。但是从中还是能够学到很多知识。比如Airbnb的工程师看我的代码非常仔细,提出了一些改进意见。面试后,我按照意见对代码进行了修改,这也是一种学习。

我为什么只投大公司?

我当初想,我投递的是iOS开发,我自己已经做过一些项目。如果去小公司,作坊式的软件开发。可能我还是会按我过去的编程习惯进行开发,完成他们的需求,这样只是把已有的知识重复以及可能学习一点新知识。而进入一个真正的大互联网公司,能学习到良好的代码开发过程以及提高自己的代码质量。
不过现在想起来,当时还是自大了些。其实,就算是小公司,也肯定是有我学习的空间的。

最后

如果你看到了这里,我十分感激!

                                       Your CJJ
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值