这几天忙着公司项目的事情,也没能腾出足够的时间来继续总结知识点。只能在闲暇的时间写一些。不过还好,剩下的这些内容,也是需要好好总结、沉淀沉淀的。
1.说一下AppDelegate的几个方法?从后台到前台调用了哪些方法?第一次启动调用了哪些方法?从前台到后台调用了哪些方法?
Appdelegate顾名思义就是整个程序的代理类。程序的启动顺序可以参照下图:
具体流程:
1>.进入main函数,设置AppDelegate,称为函数的代理。
2>.程序加载完成,调用
[AppDelegate application:didFinishLaunchingWithOptions:]
3>.创建window窗口
4>.程序被激活
[AppDelegate applicationDidBecomeActive:]
5>.当点击command+H (真对模拟器,真机是当点击home键)程序取消激活的状态。
[AppDelegate applicationWillResignActive:];
程序进入后台模式
[AppDelegate applicationDidEnterBackground:];
6>.再次点击程序,程序被激活,进入前台
[AppDelegate applicationWillEnterForeground:]
程序激活
[AppDelegate applicationDidBecomeActive:];
对于applicationWillResignActive(非活动)和applicationDidEnterBackground(后台)这两个函数方法的区分:
applicationWillResignActive:当有电话或者短信或者锁屏的情况下,应用程序挂起进入非活动的状态。当前手机界面还停留在程序界面,但是被别的任务强制占用了,亦或者是即将进入后台的状态
applicationDidEnterBackground:当前窗口不再是你的app。程序会在这个状态停留一会儿,等待再次被唤醒。但是停留时间超过3分钟左右会处于挂起的状态。若程序为音乐、定为类软件或者是经过特殊处理可以长期处于后台状态,不被挂起。
挂起状态:程序在后台不再执行代码。系统会自动把程序处理为这个状态且不会发出任何通知。挂起时,程序还是停留在手机内存中。当系统内存过低时,系统会清理挂起的应用,为前台程序提供更多的内存。
程序运行状态的变化,程序执行不同的方法及通知。如下:
(1)、非运行状态 → 前台非活动状态
执行方法:application:DidFinishLaunchingWithOptions:
执行通知:UIApplicationDidFinishLaunchingNotification;
(2)、前台非活动状态 → 前台活动状态
执行方法:application:DidBecomeActive;
执行通知:UIApplicationDidBecomeActiveNotification;
(3)、前台活动状态 → 前台非活动状态
执行方法:application:WillResignActive;
执行通知:UIApplicationWillResignActiveNotification;
(4)、后台状态 → 挂起状态
执行方法:application:DidEnterBackground;
执行通知:UIApplicationDidEnterBackgroundNotification;
(5)、挂起状态 → 非运行状态
执行方法:application:WillTerminate;
执行通知:UIApplicationWillTerminateNotification;
2.NSCache优于NSDictionary的几点?
a. NSCache在系统资源将要耗尽的时候,它可以自动删减缓存。NSDdictionary则需要手动操作删减缓存。
b.NSCache是线程安全的,NSDictionary则不具备此优势。
3.Designated Initializer
Designated Initializer(指定初始化函数)我们都知道怎么去创建一个viewController。但是创建的viewController以何种方式进行初始化呢?点开UIViewController,查看头文件。我们看到了如下两个初始化的方法
后面的那个宏“NS_DESIGNATED_INITIALIZER”是什么意思呢?这个宏定义在NSObject.h文件中。定义如下:
#ifndef NS_DESIGNATED_INITIALIZER
#if __has_attribute(objc_designated_initializer)
#define NS_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
#else
#define NS_DESIGNATED_INITIALIZER6
#endif
#endif
“__has_attribute”是Clang的一个用于检测当前编译器是否支持某一特性的一个宏。
通过上面我们可以知道“NS_DESIGNATED_INITIALIZER”其实是给初始化函数加上了一个编译器可见的标记,来帮助我们找出一些潜在的问题,避免程序运行时出现的一些奇怪的行为。
使用的注意事项:
(1)子类如果有指定初始化函数,那么指定初始化函数实现时必须调用它的直接父类的指定初始化函数。
(2)如果子类有指定初始化函数,那么便利初始化函数必须调用自己的其他初始化函数(包括指定初始化函数以及其他的便利初始化函数),不能调用super的初始化函数。
(3)如果子类提供了指定初始化函数,那么一定要实现所有父类的指定初始化函数。
4.description方法重写
description方法是NSIObject类的一个实例方法。description方法返回的永远都是一个字符串。description方法的作用就是打印对象,与java中的toString有点类似。对于一个Animal类,如果没有重写description方法,NSLog(@“%@”,animal),输出的是animal的内存地址。如果我们想要打印的是这个类的成员变量,就可以在animal类中重写description方法。
debugDescription则是我们在断点调试时,在控制台使用po命令打印会调用的方法。
5.objc使用什么机制管理对象内存?
MRC 手动引用计数
ARC 自动引用计数,苹果推荐开发者使用ARC。
6.MVC和MVVM,MVP
MVC作为老牌的架构模式,优点在于将业务场景按展示数据类型划分多个模块。每个模块中的C层负责业务逻辑和业务展示。而M和V应该是互相隔离的以做重用。另外每个模块处理得当也可以作为重用单元。拆分在于解耦,顺便做了减负,隔离在于重用,提升开发效率。但是也有缺点:没有区分业务逻辑和业务展示,对单元测试不友好。
MVP:作为MVC的进阶版,提出区分业务逻辑和业务展示。将所有的业务逻辑转移到P层,V层接受P层的数据更新通知进行页面展示。优点在于良好的分层带来了友好的单元测试。缺点:分层会让代码逻辑有点绕,同时也带来了大量的代码工作。
MVVM:通过数据绑定做数据更新,减少了大量的代码工作。同时优化了代码逻辑,学习成本比较高。