iOS面试题汇总(待整理)

学习网站:https://www.runoob.com iOS:www.cocoachina.com

安卓是Activity 苹果是Controller 大数据学习,大数据的分析以及处理

我们实例化的对象存储在堆区,而指向对象的指针一般存储在栈区

苹果官方的API是私有的不对外开放,可以通过GNU(对外开放的)代码去研究苹果的私有属性以及

方法。

tableView的cell默认宽高 320 44 真正的高度在layoutSubViews可以获取

一、App启动时的性能优化

Main之前的优化

1.二进制重排

Main之后的优化

1.能懒加载的就懒加载

2.发动CPU的性能(多线程初始化)

3.启动阶段尽量不要用Xib、storyboard。Xib、storyboard都是需要进行xml解析,相对纯代码来讲,是比较耗时的。

二、RunLoop的作用

1、运行循环,在程序运行过程中循环做一些事情

基本作用

1、保持程序的持续运行

2、处理App中的各种事情(比如触摸事件、定时器事件等)

3、节省CPU资源,提高程序性能:该做事时做事,该休息时休息

使用举例:当列表中加入定时器时需要用到runLoop,(列表中有倒计时,添加到runloop使线程包活)避免定时器暂停

滑动scrollView时,主线程的RunLoop会切换到UITrackingRunLoopMode这个Mode,执行的也是UITrackingRunLoopMode下的任务(Mode中的item),而timer是添加在NSDefaultRunLoopMode下的,所以timer任务并不会执行,只有当UITrackingRunLoopMode的任务执行完毕,runloop切换到NSDefaultRunLoopMode后,才会继续执行timer。

将Timer放到NSRunLoopCommonModes中执行即可

[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; [[NSRunLoop currentRunLoop] run];

三、事件的接受以及传递,响应链条以及传递链条

1.四种条件下UIButton无法处理点击事件 隐藏 点击效果设置为NO 透明图小于0.01 超出父视图区域

在UIView上添加手势 隐藏,设置为NO,透明度小于0.01可以处理事件

2.每个视图的hitTest:withEvent :打印两次log:1、调用时 2、返回值时

hitTest:withEvent:方法寻找合适的视图去响应,并返回响应视图

pointInside:withEvent:判断是否在当前视图的响应点上

3、手势的优先级很高,手势的代理方法,(同时响应的方法)

四、我们在使用对象调用方法时候底层是如何实现的(OC的消息机制以及转发)

objMSgSend方法

五、深浅拷贝

浅拷贝:指针拷贝(复制)内存地址和之前的是一样的,不创建新的对象

深拷贝:对象拷贝(复制) 内存地址和之前的不一样,创建新的对象,引用计数加1

原对象和拷贝对象均为不可变的时候为浅拷贝。

其它均为深拷贝。

六、controller的生命周期

视图没出现的时候加载loadView方法,->viewIdLoad->viewWillAppear->viewDidAppear->viewWillDisappear->viewDidDisappear->delloac方法结束。

七、内存管理 ARC、MRC

MRC;遵循谁创建谁释放,谁引用谁管理。创建一个对象的时候,需要使用retain,copy。释放一个对象的时候使用release或autorelease。

ARC:iOS5.0的时候提出的,当启用ARC的时候系统在适当的位置插入release或autorelease,创建对象的时候,自动插入retain。它是编译时特性,运行时机制。启用weak和 strong关键字,weak修饰的对象释放后,为nil,strong修饰的对象释放后,引用计数为0.

八、多线程的信号量以及栅栏方法

多线程的栅栏方法无法拦截全局并发队列,系统设定的,全局队列只有一条,无法拦截。

多线程使用延迟方法无法执行,可能线程会销毁。

九、tableView滑动掉帧的问题处理。

tableView处理的数据请求方法太多,使用多线程。页面太复杂,使用coreText绘制。

提前计算cell的高度,进行缓存(缓存到Model里面去)。

不要使用storyboard,xib等。

使用YYkit框架。

十、UIView与CALayer的区别

1.UIView能处理屏幕的点击事件,CALayer不能处理屏幕的点击事件

2.CALyer相对于UIView占用更小的系统资源

十一、使用Masonry的时候遇到的问题

1.控件未添加到视图上的时候导致闪退

十二、@class与#import的区别

import循环引用会报错,@class不会报错

import包括类的所有信息,包括实体类和方法 @class只是告诉后面是类的名称,其它暂时不用考虑。

十三、指针

isa:指针 实参 形参 形参置为nil,当前对象没有释放掉,形参置为nil,如果要释放必须强引用。实参置为nil,直接释放。

调用指针属性的时候,不能打点调用,应该使用[]。

地址:https://www.jianshu.com/p/6fca71be7fb0

十四、加密解密

MD5,AES,base64编码解码,对称加密以及非对称加密

十五、数据结构以及算法

冒泡排序,二分查找,使用案例(后台返回的省市区的查找)汉诺塔(排序)

十六、iOS开发中用到哪些锁,同步锁以及信号量

十七、swift与OC的区别

swift是多范式编程,既可以是面向对象的编程,也是函数响应式编程。OC中的很多类,方法都可以在swift中使用。swift中的闭包类似于OC中的block。以及其它语言的匿名函数。语法简单,代码简洁。swift与OC之间可以使用桥接。

十八、KVC的使用

键值编码,取值,赋值。可以给类的属性赋值,setValue: ForKeyPath:(不访问类的情况下)给系统的类的属性赋值,如给UITextView添加placeHolder属性。

setValue:ForKey:

十九、isKindOfClass 与 isMemberOfClass的比较。

isKindOfClass:确定一个对象是这个类的成员或者子类的成员。

isMemberOfClass:只能确定这个类是当前类的成员。

二十、如何切圆角性能最高

使用遮罩性能最高

二十一、iOS音视频

音视频采集,视频滤镜,音视频编码,推流,流媒体服务器处理,拉流,音视频解码,音视频播放。

二十二、flutter

二十三、资源加锁

二十四、id 与instanceType的区别

二十五、atomic与nonatomic的区别

atomic只是给成员变量set和get方法加锁,防止多线程一直读写成员变量,多线程下也是不安全的,使用atomic相对于nonatomic读写速度减缓了20倍。

二十六、KVO不通过改变值实时监听通知

二十七、http与https的区别

https的签名以及防篡改。(举例:提交商品信息的时候比如单价10元黑客篡改为100元)

二十八、iOS如何实现多继承

二十九、iOS universal-link

使用网页链接打开app

三十、iOS开发中相框类似face++取其中的一个区域(中软国际)

三十一、iOS单元测试

三十二、iOS bug 收集使用bugly。

三十二、模块中台化组件化

三十三、block循环引用

block只是弱引用,只能使用一次,第二次使用就释放了,避免提前释放,弱引用一次,再强引用。在整个block区块中能一直使用当前类对象。

三十四、runtime的使用

使用runtime进行方法交换,业务层不要用runtime,底层可以使用。会造成问题。

三十五、工厂模式

三十六、分类与继承的方法

分类:分散类的实现

继承:重写父类的方法,一般使用继承,继承太多,可能会出问题。

一百、对称加密以及非对称加密,算法。

你可能感兴趣的:(iOS面试题汇总(待整理))