欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

iOS 开发实训第五周周报

程序员文章站 2022-04-11 13:18:00
...

学习笔记

  • UIWindow、UIView 和 UIViewController 的关系:

    • UIWindow 窗口:UIWindow 是一个特殊的 UIView,UIWindow 类继承自 UIView,一般来说,一个 App 只有一个 UIWindow,但特定情况下也会出现多个 UIWindow,例如,键盘弹出的情况下,就会存在多个 UIWindow。iOS 启动完毕后,创建的第一个视图控件就是 UIWindow,此时需要给 UIWindow 对象指定根控制器,即设置 rootViewController 的属性,系统会自动把 rootViewController 的 view 添加到 window 上,从而在屏幕上就可以显示出程序启动后的初始界面,只要 App 未被销毁,rootViewController 就不会被销毁
    • UIView 视图:每个 UIView 都负责在屏幕上一个特定矩形区域的显示,可以通过设置 backgroundColor 属性来查看该矩形区域的范围,每个 UIView 对象除了要负责渲染视图矩阵区域内的内容之外,还要相应该区域中发生的用户交互事件,因为 UIView 继承自 UIResponder 类,并且每个 UIView 对象中都可以添加一个或多个子 UIView 对象,UIView 对象只有显示在 UIWindow 上用户才能看到界面的样式,通过 UIView 类的 window 属性可以获得该 UIView 对象所在的 UIWindow 对象
    • UIViewController 视图控制器:每个 UIViewController 都有一个 view 属性,用于显示该控制器的外观样式,UIViewController 类负责管理在 view 上显示的数据,并协调它们和应用程序其他部分的关系,UIViewController 类负责创建其管理的视图,并且在内存不足时,将它们从内容中移出,可以在 didReceiveMemoryWarning 方法中实现。除此之外,视图控制器还为某些标准的系统行为提供自动响应,例如,在设备方向变化时,如果应用程序支持该方向,视图控制器可以对其管理的视图进行尺寸调整,使其适应新的方向
  • App 的生命周期:

    • 主函数 main():main() 函数是每个 iOS 应用程序的入口,但在实际开发中,基本不需要在 main() 函数中进行额外的处理,在 main 中,最核心的功能就是把应用程序的控制权移交给 UIKit 框架,其中 UIApplicationMain 函数主要完成以下工作:

      • 创建应用程序所需的核心对象
      • 读取 storyboard 文件,来加载用户界面
      • 调用自定义的代码,用来定制应用程序的启动过程
      #import <UIKit/UIKit.h>
      #import "AppDelegate.h"
      int main(int argc, char *argv[]) {
          @autoreleasepool {
              return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
          }
      }
      
    • 应用程序的状态:在 iOS 4 之后,苹果引入了多任务功能,因此,对于应用程序来说,运行过程中就存在多种状态以及在不同状态之间的相互切换,应用程序一共存在5种状态:

      • Not Running 未运行:应用程序未启动或者被终止
      • Inactive 待**:应用程序在前台运行,但是不能接收事件(UIEvent),应用程序在不同状态之间切换时,经常会存在该状态,例如:在 App 现实启动页时,是从 Not Running 到 Active 的过程,中间会存在 Inactive 状态
      • Active **:应用程序在前台运行,可以接收事件
      • Background 后台运行:应用程序处于后台并且正在执行代码,绝大多数应用程序在进入被挂机状态时,会短暂经历这个状态
      • Suspended 挂起:应用程序处于后台,并且不能执行代码,此时,如果内存不足,操作系统可能会把自动挂起状态的应用程序移除,以便给处于 Active 状态的应用提供更多的内存空间
      • 状态变换图如下:

      iOS 开发实训第五周周报

      • 各个状态运行时的回调:
      // 告诉代理进程启动但还没进入状态保存
      - (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
            
      // 告诉代理启动基本完成程序准备开始运行    
      - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
      
      // 当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话了
      - (void)applicationWillResignActive:(UIApplication *)application
         
      // 当应用程序入活动状态执行,这个刚好跟上面那个方法相反
      - (void)applicationDidBecomeActive:(UIApplication *)application 
           
      // 当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可
      - (void)applicationDidEnterBackground:(UIApplication *)application
          
      // 当程序从后台将要重新回到前台时候调用,这个刚好跟上面的那个方法相反
      - (void)applicationWillEnterForeground:(UIApplication *)application
      
      // 当程序将要退出是被调用,通常是用来保存数据和一些退出前的清理工作
      - (void)applicationWillTerminate:(UIApplication *)application
      
      // 当程序载入后执行
      - (void)applicationDidFinishLaunching:(UIApplication*)application
      
    • 应用程序的启动过程:Not Running → Inactive → Active

      iOS 开发实训第五周周报

    • 应用程序从前台切换到后台(点击 Home 键):Active → Background → Suspended

      iOS 开发实训第五周周报

      默认情况下,applicationDidEnterBackground 方法有大概5秒时间来完成一些任务,如果5秒不够,则需要调用 beginBackgroundTaskWithExpirationHandler 方法申请更多的后台运行时间,后台运行时间由 backgroundTimeRemaining 属性来确定

    • 应用程序从后台切换到前台:

      iOS 开发实训第五周周报

    • 响应中断:比如来电话或者闹钟响的时候

      iOS 开发实训第五周周报

    • 锁屏/解锁:

      • 锁屏:applicationWillResignActive → applicationDidEnterBackground
      • 解锁:applicationWillEnterForeground → applicationDidBecomeActive