iOS 开发实训第五周周报

学习笔记

  • 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 状态的应用提供更多的内存空间
      • 状态变换图如下:

      img

      • 各个状态运行时的回调:
      // 告诉代理进程启动但还没进入状态保存
      - (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

      img

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

      img

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

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

      img

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

      img

    • 锁屏/解锁:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值