应用程序的生命周期
1.程序入口进入main函数,设置Appdelegate为代理函数UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]))2.程序加载完成进入- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions3.程序进入激活状态[AppDelegate applicationDidBecomeActive:]4.双击home进入非活状态(还有电话进来或锁屏该情况下,当前的应用程序被别的任务强制占用了)[AppDelegate applicationWillResignActive:]5.如果进入后台先进入非活状态[AppDelegate applicationWillResignActive:]再进入后台[AppDelegate applicationDidEnterBackground]6.程序进入前台(在后台不能执行代码,当挂起时,程序还是停留在内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存)先进入前台[AppDelegate applicationWillEnterForeground]再进入活动状态[AppDelegate applicationDidBecomeActive:]7.程序被杀死[AppDelegate applicationWillTerminate:];控制器的生命周期1.iOS中初始化(init)对象时,会调用对象的init方法,进入init方法时会调用initWithNibName方法,也就是 init方法会默认调用initWithNibName.(xib或者不是xib都调用),执行关键数据初始化操作,注意: 不要在这里做View相关操作,View在loadView方法中才初始化2.如果是xib,连接了串联图storyBoard,调用initWithCoder,.awakeFromNib,xib加载完毕,所有视图的outlet和action已经连接,但还没有被确定,这个方法可以算作适合视图控制器的实例化配合一起使用的,因为有些需要根据用户喜好来进行设置的内容,无法存在storyBoard或xib中,所以可以在awakeFromNib方法中被加载进来。3.loadView,控制器的view还没创建,可以再这里面。设置view,假设我们在处理内存警告时释放view属性:self.view = nil。因此loadView方法在视图控制器的生命周期内可能被调用多次,loadView方法不应该直接被调用,而是由系统调用,注意:在重写loadView方法的时候,不要调用父类的方法3.viewDidLoad,控制器自带的view已经创建完毕,一般在这里创建子控件4.viewWillAppear,视图将要出现5.viewWillLayoutSubviews,即将创建子控件(一般不用,不过测试没有调用)6.viewDidLayoutSubviews,已经布局子控件(一般不用,不过测试没有调用)7.viewDidAppear,视图已经出现8.viewWillDisappear,视图将要消失9.viewDidDisappear,视图已经消失10.didReceiveMemoryWarning,出现内存警告调用11.dealloc,视图被被销毁main之前的加载过程1.app启动时间,main之前的系统dylib(动态链接库)和自身App可执行文件的加载的时间,main之后执行didFinishLaunchingWithOptions:结束前的时间2、dyld 开始将程序二进制文件初始化交由ImageLoader 读取 image,其中包含了我们的类,方法等各种符号(Class、Protocol 、Selector、 IMP)由于runtime 向dyld 绑定了回调,当image加载到内存后,dyld会通知runtime进行处理runtime 接手后调用map_images做解析和处理接下来load_images 中调用call_load_methods方法,遍历所有加载进来的Class,按继承层次依次调用Class的+load和其他Category的+load方法至此 所有的信息都被加载到内存中最后dyld调用真正的main函数注意:dyld会缓存上一次把信息加载内存的缓存,所以第二次比第一次启动快一点