学习网站: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,底层可以使用。会造成问题。
三十五、工厂模式
三十六、分类与继承的方法
分类:分散类的实现
继承:重写父类的方法,一般使用继承,继承太多,可能会出问题。
一百、对称加密以及非对称加密,算法。