iOS 面试题(4)

阿里p5,二面 (答案为参考)

1、怎样判断某个cell 是否显示在屏幕上

 NSArray * visibleCells = [self.tableView visibleCells];
    
    if ([visibleCells containsObject:cell]) {
        //cell 在当前屏幕上

    }

2、进程与线程的区别

(1)进程是资源分配和调度的一个独立单元,而线程是CPU调度的基本单元

(2)同一个进程中可以包括多个线程,并且线程共享整个进程的资源(寄存器、堆栈、上下文),一个进程至少包括一个线程。

(3)进程的创建调用fork 或者vfork ,而线程的创建调用pthread_create,进程结束后。

(4)线程是轻量级的进程,它的创建和销毁所需要的时间比进程小很多,所有的操作系统中的执行功能都是创建线程去完成的。

(5)线程中执行时一般都要进行同步或会吃,因为他们共享同一进程的所有资源。

 (6)线程有自己私有的TCB,线程id,寄存器,硬件上下文,而进程也有自己的私有属性进程控制块PCB,这些私有属性是不被共享的,用来标记一个进程或线程的标志。

扩展: 死锁?死锁产生的原因?死锁的必要条件?怎么处理死锁

死锁产生的原因: 相互等待资源而产生的一种僵持状态,如果没有外力干预将一直持续这个状态

    (1)系统资源不足,相互竞争资源,请求资源顺序不当

     (2)互斥、不可抢占、循环等待、请求与保持

     (3)因为互斥是不可改变的,所以只能破坏其它三个条件中的一个来解除死锁,

 方法:剥夺资源,杀死其中一个线程

3、TCP与UDP的区别

1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
  UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

http://blog.csdn.net/li_ning_/article/details/52117463

4、TCP流量控制

5、数组与链表的区别

1.数组:

数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素。但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中。同样的道理,如果想删除一个元素,同样需要移动大量元素去填掉被移动的元素。如果应用需要快速访问数据,很少插入和删除元素,就应该用数组。

2.链表:

链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起,每个结点包括两个部分:一个是存储数据元素 的数据域,另一个是存储下一个结点地址的 指针。如果要访问链表中一个元素,需要从第一个元素始,一直找到需要的元素位置。但是增加和删除一个元素对于链表数据结构就非常简单了,只要修改元素中的指针就可以了。如果应用需要经常插入和删除元素你就需要用链表。

3.区别:

(1)存储位置上:

数组逻辑上相邻的元素在物理存储位置上也相邻,而链表不一定;

(2)存储空间上:

链表存放的内存空间可以是连续的,也可以是不连续的,数组则是连续的一段内存空间。一般情况下存放相同多的数据数组占用较小的内存,而链表还需要存放其前驱和后继的空间。

(3)长度的可变性:

链表的长度是按实际需要可以伸缩的,而数组的长度是在定义时要给定的,如果存放的数据个数超过了数组的初始大小,则会出现溢出现象。

(4)按序号查找时,数组可以随机访问,时间复杂度为O(1),而链表不支持随机访问,平均需要O(n); 

(5)按值查找时,若数组无序,数组和链表时间复杂度均为O(1),但是当数组有序时,可以采用折半查找将时间复杂度降为O(logn); 

(6)插入和删除时,数组平均需要移动n/2个元素,而链表只需修改指针即可; 

(7)空间分配方面: 

数组在静态存储分配情形下,存储元素数量受限制,动态存储分配情形下,虽然存储空间可以扩充,但需要移动大量元素,导致操作效率降低,而且如果内存中没有更大块连续存储空间将导致分配失败; 即数组从栈中分配空间,,对于程序员方便快速,但自由度小。

链表存储的节点空间只在需要的时候申请分配,只要内存中有空间就可以分配,操作比较灵活高效;即链表从堆中分配空间, 自由度大但申请管理比较麻

6.UIView 的声明周期

(loadView/nib)文件来加载view到内存--> viewDidLoad函数进一步初始化这些view-->内存不足时, 调用 viewDidUnload函数释放views-->当需要使用view时又回到第一步 loadView:永远不要主导调用这个函数。viewController 会在view的property被请求并且当前view值为nil时调用这个函数。如果你手动创建view, 你应该重载这个函数,切不要在重载的时候调用[super loadView]。 viewDidload:这个函数的作用主要是让你可以进一步的初始化你的views。viewDidLoad通常负责的是view及其子view被加载进内存之后的数据初始化的工作,即视图的数据部分的初始化 viewDidUnLoad:这个函数时viewDidLoad的对立函数。在程序内存欠缺时,这个函数被controller调用,来释放他的view以及view相关的对象。由于controller通常保存着view以及相关的object的引用,所以你必须使用这个函数来放弃这些对象的所有权以便内存回收,但不要释放那些难以重建的数据 viewWillAppear:视图即将可见时调用,默认情况下不执行任何操作。 viewWillLayoutSubViews:视图在显示之前会布局子控件(将要布局子控件的时候调用) viewDidLayoutSubViews:已经布局完子控件的时候调用 viewDidAppear:视图已完全过渡到屏幕上时调用 viewWillDisappear:视图被驳回时调用,覆盖或以其他方式隐藏,默认情况下不执行任何操作 viewDidDisappear:视图被驳回后调用,覆盖或以其他方式隐藏。默认情况下不执行任何操作 didReceiveMemoryWarning:当程序内存过度时,系统会调用该方法
链接:https://www.jianshu.com/p/ce3eeaebbe93

7.如果页面A跳转到页面B,A的viewDidDisappear 方法和B 的ViewDidAppear方法哪个先调用?
A的viewDidDisappear 先调用

8.block 的循环引用问题
9、ARC的本质
https://www.cnblogs.com/yyxblogs/p/4866813.html
https://www.cnblogs.com/runner42/p/5031154.html
10、Runloop的基本概念,它是怎么休眠的?
11、AutoReleasepool 什么时候释放,在什么场景下使用?
12、如何找到字符串中第一个不重复的字符
13、哈希表如何处理冲突

阿里P6
1.NSString占用多少内存?
2.SD最大支持多少个下载数?
3.yykit如何异步渲染?
4.runtime动态创建一个类,需要注意什么?
5.runloop和线程有和关系?
6.你平时做过什么有技术难点的东西,然后解决难点
7.你是如何学习iOS,看什么网站,列举几个国外的学习网站?
8.技术架构如何搭建?
9.还有一个很长字符串,你用什么算法搜索到abc的位置?
10.字符串如何预处理?
11.https和ssl在握手方向有什么区别?
12.还有,你平时很忙,怎么学习和积累技术
13.怎么防止别人动态在你程序生成代码
14.怎么防止反编译


阿里-p6-一面
1.介绍下内存的几大区域?
2.你是如何组件化解耦的?
3.runtime如何通过selector找到对应的IMP地址
4.runloop内部实现逻辑?
5.你理解的多线程?
6.GCD执行原理?
7.怎么防止别人反编译你的app?

1.本地数据加密

iOS应用防反编译加密技术之一:对NSUserDefaults,sqlite存储文件数据加密,保护帐号和关键信息

2.URL编码加密

iOS应用防反编译加密技术之二:对程序中出现的URL进行编码加密,防止URL被静态分析

3.网络传输数据加密

iOS应用防反编译加密技术之三:对客户端传输数据提供加密方案,有效防止通过网络接口的拦截获取数据

4.方法体,方法名高级混淆

iOS应用防反编译加密技术之四:对应用程序的方法名和方法体进行混淆,保证源码被逆向后无法解析代码

5.程序结构混排加密

iOS应用防反编译加密技术之五:对应用程序逻辑结构进行打乱混排,保证源码可读性降到最低

6.借助第三方APP加固,例如:网易云易盾

8.YYAsyncLayer如何异步绘制?
9.优化你是从哪几方面着手?

参考答案地址(学习视频等资源也在公众号内):
http://url.cn/5YAhbxs


淘宝-P7
1.查找字符串算法
2数组匹配算法
3.代码文件编译生成过程,编译和链接有什么区别,链接做了什么事情
4.用C语言实现一个通知流程
5.A B 线程执行到一半去执行C线程,用OC和C各自怎么实现。
6.对什么技术比较感兴趣
7.tableview怎么优化,优化后还是感觉卡怎么办
8.怎么定位到野指针的地方。如果还没定位到,这个对象被提前释放了,怎么知道该对象在什么地方释放的
9.ARC的实现原理,什么情况下用MRC比ARC好
10.16进制的FF + 2后 等于什么 有哪几种情况?

饿了么面试题:
你了解哪些iOS底层知识

  • automic一定是线程安全的吗
  • iOS中的消息传递是怎么一步一步实现的
  • category和extension有什么区别
  • iOS中的私有属性如何设置
  • 串行队列和同步锁两者在保护线程安全上的性能对比
  • 并行队列是同时执行的吗
  • iOS中有哪些锁,你了解多少
  • iOS中UIKit框架的架构
  • UIView和CALayer之间的关系
  • UIView、CoreAnimation和CoreGraphics的关系
  • 应该知道SegmentFault,这个在iOS中是什么错误,那StackOverFlow呢
  • GCD、NSThread、NSOperation性能上有何区别

百度iOS面试题:
1.Delegate 、Notification和KVO比较各自的优缺点
2.在一个UI的正中间实现一个正方形的红色视图有几种方式?
3.手触碰到屏幕的时候,响应机制是怎样的?第一响应者是谁?追问 UIView和UIResponse的关系是什么?
4。UIViewController的生命周期是什么?追问 UIViewController 只alloc而没用到的时候,UIViewController 的view是否加载了?如果没有加载那什么时候加载?
5.直接用UILabel和自己用DrawRect画UILabel,哪个性能好?为什么?哪个占用的内存少?为什么?
6.AFNetworking是否支持ipv6?
7.项目采用64位,为什么要用64位?怎么修改成64位?i386是什么?他们有什么关系?
8.iOS的应用程序有几种状态?追问,退到后台代码是否可以执行?双击home键,代码是否可以执行?
9.一般使用的图标内存为多大?比如200×300的图片,内存应该占用多少比较合理?
10.说说你对内存泄漏的看法,追问,block为什么容易引起内存泄漏?
11.[object copy]是浅拷贝还是深拷贝?为什么是浅拷贝?copy是实现了哪个协议?
12.Images.xcassets和直接用图片有什么不一样?

搜狗iOS面试题:
1.iOS应用的文件目录都是什么?缓存文件存在哪个文件里?它的上一层是什么?

2.SDWebImage图片处理原理?

3.SDWebImage在iOS9 3dtouch下出现的问题?

4.NSArray和NSMutableArray在Copy和MutableCopy下的内存是怎样的?

5.用户下载一个图片,图片很大,需要分成很多份进行下载,使用GCD应该如何实现?使用什么队列?

6.现有两个人和一张桌子,两个人依次在桌子上放硬币,硬币不能叠放、立着,若一方找不到放的位置则失败。若你在玩这个游戏,设计一个算法必赢。

7.现有n个物品和一个体积为V的包,每件物品的体积是ci,价格是wi,现在请你往包中放,每件物品只能放一次,怎么放能让包的价格最大。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值