1、 APP main 为什么一直运行,不会退出,while,RunLoop
#mark 应用程序的启动原理
int main(int argc, char * argv[]) {
NSString * appDelegateClassName;
@autoreleasepool {
// Setup code that might create autoreleased objects goes here.
appDelegateClassName = NSStringFromClass([AppDelegate class]);
}
//第三个参数:UIApplication的名称或者是它子类的名称 nil = @"UIApplication"
//第四个参数:UIApplication对象代理的名称
//NSStringFromClass([AppDelegate class])
return UIApplicationMain(argc, argv, nil, appDelegateClassName);
}
1、执行main函数
2、执行UIApplicationMain
2.1、 创建UIApplication对象,并设置UIApplication它的代理。
2.2、 开启了一个事件循环(mainRunloop),主运行循环,死循环,保证应用程序不退出。
2.3、 加载info.plist(判断info.list当中有没有指定Main,如果指定的话
{
系统自动帮你做的事情:
加载Main.storyBoard,加载之前会创建一个window,
因为每一个window都必须得要设置一个根控制器.rootViewController,设置的目的是强引用根控制器让它不释放,
所以会把Main.storyBoard当中箭头指向的控制器设置为window的rootViewController。
把Main.storyBoard当中箭头指向的控制器的view添加到window,让window显示出来。
}
2.4、 通知应用程序代理,应用程序启动完毕. didFinishLaunchingWithOptions:
2、 ViewController 调用过程,loadView,viewDidLoad等方法做什么
图解:
1、view在被调用时先找有没有,有就直接返回,没有就进入loadView;
2、然后判断loadView方法是不是自定义的,如果是就进入自定义方法加载view,然后进入viewDidLoad,最后返回view,如果不是自定义的就判断是否存在storyboad;
3、如果存在storyboad就从storyboad上加载view,然后进入viewDidLoad,最后返回view
4、如果不存在storyboad则系统直接加载一个空view,然后进入viewDidLoad,最后返回view
3、WKWebView OC与js互调原理(自有方法方法回调和WWJB-scheme拦截处理)
4、 iOS中数据存储的方式有哪些?
(1)属性列表 NSUserdefault 系统给我们定义的存储单例类用于存储少量的用户数据,系统将它存储在沙盒下library/prefrence下,以key/value的形式存储。小数据量的存储和查询操做。
(2)对象序列化 也就是归档,当自定义对象想要进行归档时需要遵循nscoding协议,其中有两个协议方法initwithcode编码和encodewithcode解码。小数据量的存储和查询操做。
(3)SQLITe 大数据量的存储和查询操做。
(4)CoreData 大数据量的存储和查询操做。
5、 iOS中的通信方式有哪些?
(1)delegate 是一种回调机制,是一对一的通信交互,需要定义协议方法、代理属性,并且建立代理关系和实现协议方法才能实现通信,效率高。
(2)block 是一种回调机制,是一对一的通信交互,使用简单,通信事件比较多的话建议使用delegate。
(3)nsnotification 是一对多的通信交互,对象之间不需要建立关系,但需要一个中心对象向所有观察者提供变更通知,负责发出通知。
(4)kvo 是一对多的通信交互,对象之间不需要建立关系,被观察者直接向观察者发送通知,负责发出通知。
6、 系统中单例类
(1)UIApplication(应用程序实例)
(2)NSUserDefaults(应用程序设置)
(3)NSNotificationCenter(通知中心)
(4)NSFileManager(文件管理)
(5)NSURLCache(请求缓存)
(6)NSHTTPCookieStorage(应用程序cookie池)
7、 内存泄漏检查
静态分析方法(Analyze)和动态分析方法(Instrument的leak)。
Analyze 优点:
2、能够在编码阶段,开发自行进行代码检查。早期发现代码隐患。
3、直接分析源代码来发现程序中的错误,而不需要实际运行。
4、自动检测Objective-C程序中的BUG,发现内存泄露和其它问题。
5、内存问题发现越早,解决的代价就越小。
主要分析以下四种问题:
1、逻辑错误:访问空指针或未初始化的变量等;2、内存管理错误:如内存泄漏等;3、声明错误:从未使用过的变量;4、Api调用错误:未包含使用的库和框架。
Instruments里面工具很多,常用:1). Time Profiler: 性能分析2). Zombies:检查是否访问了僵尸对象,但是这个工具只能从上往下检查,不智能。3). Allocations:用来检查内存,写算法的那批人也用这个来检查。4). Leaks:检查内存,看是否有内存泄露。