1、设计模式是什么? 你知道哪些设计模式,并简要叙述?
设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型的事情。
1). 单例模式:通过static关键词,声明全局变量。在整个进程运行期间只会被赋值一次。
2). 观察者模式:KVO是典型的通知模式,观察某个属性的状态,状态发生变化时通知观察者。
3). 委托模式:代理+协议的组合。实现1对1的反向传值操作。
4). 工厂模式:通过一个类方法,批量的根据已有模板生产对象。
什么是单例模式
简单的来说,一个单例类,在整个程序中只有一个实例,并且提供一个类方法供全局调用,在编译时初始化这个类,然后一直保存在内存中,到程序(APP)退出时由系统自动释放这部分内存。
系统为我们提供的单例类有哪些?
UIApplication(应用程序实例类)NSNotificationCenter(消息中心类)NSFileManager(文件管理类)NSUserDefaults(应用程序设置)NSURLCache(请求缓存类)NSHTTPCookieStorage(应用程序cookies池)
在哪些地方会用到单例模式
一般在我的程序中,经常调用的类,如工具类、公共跳转类等,我都会采用单例模式
单例类的生命周期(单例实例在存储器的中位置)
在程序中,一个单例类在程序中只能初始化一次,为了保证在使用中始终都是存在的,所以单例是在存储器的全局区域,在编译时分配内存,只要程序还在运行就会一直占用内存,在APP结束后由系统释放这部分内存内存。
单例模式的优缺点
(1)、在整个程序中只会实例化一次,所以在程序如果出了问题,可以快速的定位问题所在;
(2)、由于在整个程序中只存在一个对象,节省了系统内存资源,提高了程序的运行效率;
(1)、不能被继承,不能有子类;
(2)、不易被重写或扩展(可以使用分类);
(3)、同时,由于单例对象只要程序在运行中就会一直占用系统内存,该对象在闲置时并不能销毁,在闲置时也消耗了系统内存资源;
代理主要由三部分组成:
协议:用来指定代理双方可以做什么,必须做什么。
代理:根据协议,完成委托方需要实现的功能(方法)。
委托:根据协议,指定代理去完成什么功能。
2、MVC 和 MVVM 的区别
1). MVVM是对胖模型进行的拆分,其本质是给控制器减负,将一些弱业务逻辑放到VM中去处理。
2). MVC是一切设计的基础,所有新的设计模式都是基于MVC进行的改进。
1). MVC模式:Model View Control,把模型 视图 控制器 层进行解耦合编写。
2). MVVM模式:Model View ViewModel 把模型 视图 业务逻辑 层进行解耦和编写。
3、ViewController生命周期
1.initWithCoder:通过nib文件初始化时触发。2.awakeFromNib:nib文件被加载的时候,会发生一个awakeFromNib的消息到nib文件中的每个对象。3.loadView:开始加载视图控制器自带的view。4.viewDidLoad:视图控制器的view被加载完成。5.viewWillAppear:视图控制器的view将要显示在window上。6.updateViewConstraints:视图控制器的view开始更新AutoLayout约束。7.viewWillLayoutSubviews:视图控制器的view将要更新内容视图的位置。8.viewDidLayoutSubviews:视图控制器的view已经更新视图的位置。9.viewDidAppear:视图控制器的view已经展示到window上。10.viewWillDisappear:视图控制器的view将要从window上消失。11.viewDidDisappear:视图控制器的view已经从window上消失。
4、你是否接触过OC中的反射机制?简单聊一下概念和使用
1).class反射 通过类名的字符串形式实例化对象。 Classclass=NSClassFromString(@"student"); Student *stu = [[classalloc] init]; 将类名变为字符串。 Classclass=[Studentclass];NSString*className =NSStringFromClass(class);
2). SEL的反射 通过方法的字符串形式实例化方法。 SEL selector =NSSelectorFromString(@"setName"); [stu performSelector:selector withObject:@"Mike"]; 将方法变成字符串。NSStringFromSelector(@selector*(setName:));
5、iOS的沙盒目录结构是怎样的?
沙盒结构:
1). Application:存放程序源文件,上架前经过数字签名,上架后不可修改。
2). Documents:常用目录,iCloud备份目录,存放数据。(这里不能存缓存文件,否则上架不被通过)
3). Library:
Caches:存放体积大又不需要备份的数据。(常用的缓存路径)
Preference:设置目录,iCloud会备份设置信息。
4). tmp:存放临时文件,不会被备份,而且这个文件下的数据有可能随时被清除的可能。
6、什么是 RunLoop
从字面上讲就是运行循环,它内部就是do-while循环,在这个循环内部不断地处理各种任务。一个线程对应一个RunLoop,基本作用就是保持程序的持续运行,处理app中的各种事件。通过runloop,有事运行,没事就休息,可以节省cpu资源,提高程序性能。主线程的run loop默认是启动的。iOS的应用程序里面,程序启动后会有一个如下的main()函数intmain(intargc,char* argv[]) {@autoreleasepool{returnUIApplicationMain(argc, argv,nil,NSStringFromClass([AppDelegateclass])); }}
7、HTTP协议中 POST 方法和 GET 方法有那些区别?
1. GET用于向服务器请求数据,POST用于提交数据
2. GET请求,请求参数拼接形式暴露在地址栏,而POST请求参数则放在请求体里面,因此GET请求不适合用于验证密码等操作
3. GET请求的URL有长度限制,POST请求不会有长度限制
8、谈谈 UITableView 的优化
1). 正确的复用cell。
2). 设计统一规格的Cell
3). 提前计算并缓存好高度(布局),因为heightForRowAtIndexPath:是调用最频繁的方法;
4). 异步绘制,遇到复杂界面,遇到性能瓶颈时,可能就是突破口;
4). 滑动时按需加载,这个在大量图片展示,网络加载的时候很管用!
5). 减少子视图的层级关系
6). 尽量使所有的视图不透明化以及做切圆操作。
7). 不要动态的add 或者 remove 子控件。最好在初始化时就添加完,然后通过hidden来控制是否显示。
8). 使用调试工具分析问题。
9、Swift和OC的区别
1.不像C语言和OC语言一样都必须有一个主函数main()作为程序的入口, swift程序从第一句开始向下顺序执行, 一直到最后
2.每个语句结束后可以不加分号, 但是多条语句不能写在同一行
3.在声明常亮后者变量的时候直接初始化可以省略其类型, 否则需要在变量名称跟冒号加类型. 实际开发中建议全部都加上, 以免出现问题
4.swift数据类型都会自动判断, 只区分变量var 和 常量let
5.swift可以多对多赋值. let(x,y) = (1,2)
6.swift和OC比较具有全局性, 因为swift是全局的所以编译的速度比OC慢
10、iOS自定义控件开发方式
使用代码创建自定义控件
1.创建一个继承自UIView的类
2.实现initWithFrame:方法。在该方法中,设置自定义控件的属性,并创建、添加子视图:
3.如果需要对子视图重新布局,需要调用layoutSubViews方法
4.最后,添加自定义控件到页面上
小结
这两种创建自定义控件的方式各有优劣,纯代码方式比较灵活,维护和扩展都比较方便,但写起来比较麻烦。xib方式开发效率高,但不易扩展和维护,适合功能样式比较稳定的自定义控件。
11、iOS事件分发机制介绍与应用
iOS事件分发流程1.hitTest 2.sendEvent 3.事件处理
事件响应链
UIResponder类能够响应触摸、手势以及远程控制等事件。它是所有可响应事件的基类,其中包括很常见的UIView、UIViewController以及UIApplication。那么事件响应链与UIResponder有什么关系呢?应用内的视图按一定的结构组织起来,即树状层次结构,一个视图可以有多个子视图,而子视图只能有一个父视图。当一个视图被添加到父视图上时。每一个视图的nextResponder属性就指向它的父视图,这样,整个应用就通过nextResponder串成了一条链,即响应链。响应链是一个虚拟链,并不是真实存在的,它借助UIResponder的nextResponder串连起来
Hit-Test View
有了事件响应链,接下来就是寻找具体响应对象了,我们称之为:Hit-Testing View,寻找这个View的过程称为Hit-Test。
什么是Hit-Test?我们可以把它理解为一个探测器,通过这个探测器,我们可以找到并判断手指是否触摸在某个视图上。
Hit-Test是如何工作的?Hit-Test采用递归方式从视图的根节点开始遍历,直到找到某个点击的视图。
首先从UIWindow发送hitTest:withEvent:消息开始,判断该视图是否能响应触摸事件,如果不能响应返回nil,表示该视图不能响应触摸事件。然后再调用pointInside:withEvent:方法,该方法用于判断触摸事件点击的位置是否处理该视图范围内,如果pointInside:withEvent:返回no,那么hitTest:withEvent:也直接返回nil。
如果pointInside:withEvent: 方法返回yes,那么该视图向所有子视图发送hitTest:withEvent:消息,所有子视图的调用顺序是从最顶层视图一直到最底层视图,即从subViews的数组的末尾向前遍历。直到有子视图返回非空对象或全部遍历完毕。若有子视图返回非空对象,则hitTest:withEvent:方法返回该对象,处理结束;若所有子视图都返回nil,则hitTest:withEvent:方法返回该视图自身。
事件传递机制的应用
举几个例子,说明一下事件传递机制在自定义控件中的应用。
12、iOS本地数据保存常用方式
NSUserDefaults
归档(序列化)
文件
数据库
CoreData
KeyChain
13、谈谈你对多线程开发的理解?ios中有几种实现多线程的方法?
好处:
1.使用多线程可以把程序中占据时间长的任务放到后台去处理,如图片,视频的下载;
2.发挥多核处理器的优势,并发执行让系统运行的更快,更流畅,用户体验更好;
缺点:
1.大量的线程降低代码的可读性;
2.更多的线程需要更多的内存空间;
3当多个线程对同一个资源出现争夺的时候要注意线程安全的问题。
ios有3种多线程编程的技术:1.NSThread,2.NSOperationQueue,3.gcd;
NSThread.
每个NSThread对象对应一个线程,量级较轻(真正的多线程)
NSThree是官方推荐的线程处理方式,它在处理机制上,需要开发者负责手动管理Thread的生命周期,包括子线程与主线程之间的同步等。线程共享同一应用程序的部分内存空间,它们拥有对数据相同的访问权限。你得协调多个线程 对同一数据的访问,一般做法是在访问之前加锁,这会导致一定的性能开销。在 iOS 中我们可以使用多种形式的 thread。 比其他两个轻量级 需要自己管理线程的生命周期,线程同步。 线程同步对数据的加锁会有一定的系统开销.
NSOperation/NSOperationQueue 面向对象的线程技术
如果需要让线程同时并行运行多个,可以将线程加入队列(Queue)中,NSOperationQueue类就是一个线程队列管理类,他提供了线程并行、队列的管理。可以认为NSOperationQueue就是一个线程管理器,通过addOperations方法,我们可以一次性把多个(数组形式)线程添加到队列中。同时,NSOperationQueue允许通过setMaxConcurrentOperationCount方法设置队列的并行(同一时间)运行数量
Grand Central Dispatch(GCD)是Apple开发的一个多核编程的解决方法。该方法在Mac OS X 10.6雪豹中首次推出,并随后被引入到了iOS4.0中。GCD是一个替代诸如NSThread, NSOperationQueue, NSInvocationOperation等技术的很高效和强大的技术,它看起来象就其它语言的闭包(Closure)一样,但苹果把它叫做blocks。
GCD —— Grand Central Dispatch(大调度中心) 是基于C语言的框架,可以充分利用多核,是苹果推荐使用的多线程技术
以上这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单,也是Apple最推荐使用的,在项目中很多框架技术分别使用了不同多线程技术。
三种多线程技术的对比
NSThread:
优点:NSThread 比其他两个轻量级,使用简单
缺点:需要自己管理线程的生命周期、线程同步、加锁、睡眠以及唤醒等。线程同步对数据的加锁会有一定的系统开销
NSOperation:不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上–NSOperation是面向对象的
优点: 提供了一些在GCD中不容易实现的特性,如:限制最大并发数量,操作之间的依赖关系.
GCD:NSOperation的高效和强大的技术–GCD是基于C语言的
优点1:用Block定义任务,使用起来非常灵活便捷;(要注意:也可能出现循环引用)
优点2:提供了更多的控制能力以及操作队列中所不能使用的底层函数.
14、iOS App上架流程
15、代理丶通知丶KVO之间是怎么在控制器之间通信的,或者说是怎么传值的,又或者说之间的区别
1.委托 delegation;
2.通知中心 Notification Center;
3.键值观察 key value observing(KVO)
16、iOS-APP瘦身
17、APP内测方式
第三方框架
1、AFNetworking 底层原理分析
AFNetworking主要是对NSURLSession和NSURLConnection(iOS9.0废弃)的封装,其中主要有以下类:1). AFHTTPRequestOperationManager:内部封装的是NSURLConnection, 负责发送网络请求, 使用最多的一个类。(3.0废弃)2). AFHTTPSessionManager:内部封装是NSURLSession, 负责发送网络请求,使用最多的一个类。3). AFNetworkReachabilityManager:实时监测网络状态的工具类。当前的网络环境发生改变之后,这个工具类就可以检测到。4). AFSecurityPolicy:网络安全的工具类, 主要是针对 HTTPS 服务。5). AFURLRequestSerialization:序列化工具类,基类。上传的数据转换成JSON格式 (AFJSONRequestSerializer).使用不多。6). AFURLResponseSerialization:反序列化工具类;基类.使用比较多:7). AFJSONResponseSerializer; JSON解析器,默认的解析器.8). AFHTTPResponseSerializer; 万能解析器; JSON和XML之外的数据类型,直接返回二进制数据.对服务器返回的数据不做任何处理.9). AFXMLParserResponseSerializer; XML解析器;
2、描述下SDWebImage里面给UIImageView加载图片的逻辑
加载图片的过程大致如下:1.首先会在 SDWebImageCache 中寻找图片是否有对应的缓存, 它会以url 作为数据的索引先在内存中寻找是否有对应的缓存 2.如果缓存未找到就会利用通过MD5处理过的key来继续在磁盘中查询对应的数据, 如果找到了, 就会把磁盘中的数据加载到内存中,并将图片显示出来 3.如果在内存和磁盘缓存中都没有找到,就会向远程服务器发送请求,开始下载图片 4.下载后的图片会加入缓存中,并写入磁盘中5.整个获取图片的过程都是在子线程中执行,获取到图片后回到主线程将图片显示出来
SDWebImage原理:调用类别的方法:1.从内存(字典)中找图片(当这个图片在本次使用程序的过程中已经被加载过),找到直接使用。2.从沙盒中找(当这个图片在之前使用程序的过程中被加载过),找到使用,缓存到内存中。3.从网络上获取,使用,缓存到内存,缓存到沙盒。