程序运行器、窗口、调控器加载、调整器View加载

作者:操作系统

/*前后相继运转进程:main-UIApplicationMain***********UIApplicationMain底层做的职业***********UIApplicationMain底层做的事情:1.创办UIApplication对象2.创办AppDelegate对象,并且赋值给UIApplication对象的代办属性3.开启主运营循环4.加载info.plist文件,判别是还是不是钦赐main.storyboard,假设内定,就去加载。*****************main.storyboard底层做的事情*****************加载main.storyboard底层做如何业务1.创办UIWindow对象2.加载storyboard,创设storyboard中的调整器3.把新创造的控制器作为窗口的根调节器,让窗口显示在显示屏上上心:窗口要展现出来,必得保险设置尺寸,制止销毁*****************窗口补充*****************广大的窗口:键盘,UIActionSheet,UIAlertView,都会付出application.windows特殊的窗口:状态栏窗口的层级:UIWindowLevelNormalUIWindowLevelStatusBarUIWindowLevelAlert窗口暗中同意都以UIWindowLevelNormal层级键盘的层级恒久是最高的,在浮现此前会博安妥前最高层级数,然后键盘的层级 1.多少个应用程序只好有二个主窗口*****************窗口中底层完结格局*****************rootViewController好处:1.让窗口旋转2.让代码结构清晰rootViewController底层实现:第一步:让窗口能够转动makeKeyAndVisible底层完成:1.化为application的主窗口application.keyWindow=self.window;2.让窗口体现出来self.window.hidden=NO;3.把窗口根调控器的view增加到窗口上[self.windowaddSubview:window.rootViewController.view];,self.window=window底层实现:就能够把方今的窗口增加到荧屏上************通过storyboard创设调节器************1.加载storyboard2.实例化调整器************通过xib创设调节器*****************1.创立xib的文书2.往xib里面拖一个view,用来说述调节器的view3.告诉那一个xib是用来描述调节器,设置文件具有者(file'ownerState of Qatar,就可以连线,接着直接连线错误:loadedthe"VC"nibbuttheviewoutletwasnotset解决:加载xib供给连线,怎么消灭,首先你须求告这些xib是描述哪个调节器,设置xib的file'owner为调整器Class************控制器view的加载*****************loadView成效:成立调节器的viewloadView什么日期去调用:第一遍采纳调控器的view的时候就能够调用loadView只要重写了loadView这几个措施,就务须和睦创办调整器的view,系统就不会帮您创设调控器viewHMViewController-HMView.xib-HMViewController.xibloadView底层做法1.确定下有未有钦赐storyboard,假使有,就去加载storyboard描述的调节器的view2.判定下有未有钦定nibName,假使有,就去加载nibName描述的调整器的view2.如何判断有未有钦点nibName,[selfnibName]2.1论断下nibName是不是为空,如若为空,他会尝试找下有未有跟调控器同名,可是不带Controller的xib2.2跟调整器同名的xib,nibName=ViewController,不过这一步有标准,前提条件你未曾重写loadView2.3要是都还没找到,间接创制差非常的少透明的viewinit方法底层调用initWithNibName:bundle:**************************导航调控器基本概念***********************1.开立导航调控器一定要有叁个导航调整器的根调整器,因为导航条的内容一定要注重栈顶调控器,默许第一个根调整器正是栈顶控制器2.initWithRootViewController:底层会调用pushViewController。pushViewController:底层会把调整器压入栈,而且把调控器的view增多到导航条上边。3.等急需push调整器的view完全彰显的时候,会得到push调控的navigationController属性赋值导航调节器vc.navigationController=nav;4.导航调控器的viewControllers用来保存导航调控器里面有着的子调节器5.导航调整器长久展现出来的分界面是栈顶调整器的view6.调用那些艺术,并不会应声出栈,等调节器的view完全移除父控件,才会出栈,调控器出栈后,就能够被灭亡********************************导航条的源委***********************1.导航条的剧情由栈顶调整器的UINavigationItem决定,为啥要如此设计,因为导航调节器独有二个导航条,尽管各类子调整器都能安装,就不领悟听什么人的了,所以由显示出来的调节器决定。2.UINavigationItem:是三个模型,用来决定导航条的剧情。3.UIBarButtonItem:是三个模子,用来调节导航条上按键的从头到尾的经过。4.导航条下边的子控件的职分由系统调整,不过尺寸是由我们团结主宰4.1[buttonsizeToFit]暗中同意计算按键尺寸,依照开关的开始和结果总括出最合适的尺寸5.在ios7后头,默许就能够导航条上的按键的图样渲染成黑色5.1哪些保证图片最原始的作用,不要渲染[imageimageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];5.2Item正是模型,MVC,修改模型就能够改分界面

b、注意

1. 加载Main.storyboard步骤

a. 创建窗口

b. 加载Main.storyboard,並且加载Main.storyboard钦定的调控器

c. 把新的调节器作为窗口的根调节器,并让窗口呈现出来

  1. 步骤
    a. 创立三个调控器类
    b. 创制三个xib,并点名所呈报的调控器,五个xib 只可以用来汇报一个调整器,若无点名,就不能够拖线钦命控制器的view
    c. 拖线钦命xib 中的哪个UIView 是调节器的view
  2. 独有调整器的init 的不二秘技,底层才会调用initWithNibName:bundle:方法
  3. UIView 的创建
    a. 要是重写loadView ,就依附自定义view 去创设view
    b. 若无重写loadView,就去查看有未有storyboard,有storyboard,就遵照storyboard 描述的view去创建
    c. 若无storyboard 就去看是否 有对于的XIB,有xib 就依附xib 的描述的view创造
    d. 若无xib, 即nibName == nil 时,就查有未有同名的xib,可是优先查看未有controller 的xib, 尽管查不到与xib完全同名的xib,如:xib的具有者是viewController ,xib 的文件名便是view,就优先查view.xib,依据它的叙说的view创立;若无公文名的xib,就去查看名称叫ViewController 的xib, 如若有就依靠xib 里的陈诉的view 成立
  4. 控制器的loadView方法
    a. loadView的效用:自定义调节器view, 只要重写那些主意,表达要创立view,就不会活动创立view
    b. loadView 表明时候调用:第二次使用view的时候调用,调用这些法子创造调控器的view
    c. loadView 私下认可做法:假设storyboard 描述了调整器view,就去加载
    d. 注意:1.假诺重写loadView方法,没有调用系统暗许的做法,即不写[super loadView],就不会去加载storyboard大概xib来汇报调控器的view 2.倘使重写loadView方法,并且钦点了nibName,loadView私下认可的做法会去加载xib的view 3. 要是重写loadView方法,未有一点名nibName,就不会自动去加载和调节器同名的xib 4. 在重写loadView时,未有给self.view创立view,就采纳self.view,会促成死循环 5. 意气风发旦是根调整器的view,自定义view的时候能够不设置尺寸,系统会自行安装;不是跟调控器就拾壹分;能够用CG途达ctZeco表示,如:self.view = [[UIView alloc] initWithFrame: CGRctZeco]; 6. 重写loadView方法时,不要写[super loadView];,因为重写该方式的指标是自定义view,重写了还要去加载storyboard里的view,等于为蛇画足
  5. xib 和storyboard 的区别
    storyboard 已经钦命了调节器view,没有必要大家管,xib 需求大家手动处理。
  6. 怎么着快速生成三个xib 描述的调控器view
    1、定义新的调节器的时候,勾选xib,会活动搞叁个xib描述调节器的view
    2、会自动生成三个和调控器同名的xib,並且在这之中安装好了

(三卡塔尔国. Info.plist文件(项目布置文件State of Qatar

  1. 功用:保存应用的消息,软件名称、版本号等等,相当于居民身份证
  2. Bundle name:程序名称,无法超越10个字节
  3. Bundle versions string, short:APP版本号
  4. Bundle identifier:应用软件项目唯豆蔻梢头标记
  5. Bundle version:内部开辟人士使用的版本号
  6. Main storyboard file base name:第后生可畏运转的storyboard文件
  7. 瞩目:图形化的Info.plist文件上边包车型地铁KEY不是真实的KEY,要想看真正的KEY得看Info.plist文件的源码
    操作:Info.plist(选中后右键单击State of Qatar -> Open As -> Source Code
  8. 代码查看版本号
NSDictionary *dicInfo = [NSBundle mainBundle].infoDictionary;
NSLog(@"%@",dicInfo[@"CFBundleShortVersionString"]);

二、程序运转原理

2. 作用

(1State of Qatar. 贮存一些公用的宏
(2卡塔尔(قطر‎. 寄存一些公用头文件
(3State of Qatar. 管理日志的出口,自定义Log

三、加载Main.storyboard

二. 程序的起步原理

四、通过XIB 创造调控器的View

(4卡塔尔国. 加载Info.plist和起步图片,并且推断Info.plis有未有钦定Main.storyboard,如若钦赐,就去加载

  1. 加载Main.storyboard 步骤
    a. 成立窗口
    b. 加载Main.storyboard,並且加载Main.storyboard内定的调整器
    c. 把新的调控器作为窗口的根调节器,并让窗口展现出来
  2. 窗口Window
    a. UIWindow 是一个不落俗套的UIView, 在八个app 中平日都会有叁个UIWindow ,但不光唯有二个,举例:键盘也是三个窗口
    b. app 程序运营成功后,成立的率先个视图控件就是UIWindow, 接着创设调整器的UIView,最终将调节器增添到Window上,于是调整器的view 就展现在显示屏上了。
    c. 三个app 之所以能彰显在荧屏上,完全部都以因为有UIWindow。
    d. UIScreen :标记物理的显示屏,他总是着器具。
    e. UIWindow :用于提供绘制扶植,提供了后生可畏都部队分制图方法。
    f. UIView :窗口上有非常多view,是用来绘图操作的,把画好的view 增添到窗口上;荧屏上的事物都以绘制上去的,刷新叁遍相当于重新绘制一次。
    g. 唯有加载Main.storyborad 的时候才创建窗口(加载:系统活动加载)
    h. 要是是慈祥用代码加载Main.storyborad 要求协和创建窗口代码。
  3. 补充
    a. 要是把新建的调整器的view用addSubview: 方法间接抬高到窗口上,不会有旋转成效。
    b. 设置窗口的根视图调整器RootViewController,会自动把调整器的view加多到窗口。
    c. 查看主窗口:application.keyWindow
    d. 呈现窗口:self.window.hidden = NO
    e. 查看程序的保有窗口:application.windows
  4. addSubView 和rootViewController 的区别
    a. 间接用addSubView,调控器会被放飞,调控器就不可能处总管件。
    b. 直接用addSubView,调整器的view不会旋转。
    c. 用rootViewController,调节器不会被放飞,何况调节器的view会自动旋转。
    d. 旋转事件->UIApplication -> window -> rootViewController -> 旋转调控器view
  5. makeKeyAndVisible 方法底层做的事
    a. 把窗口设置成主窗口,如:application.keyWindow = self.window;
    b. 呈现窗口,如:self.window.hidden = NO;
    c. 注意:尽管底层会做地点两步,但不自然是下面的代码。
  6. 窗口的层级
    a. windowLevel: UIWindowLevelNormal < UIWindowLevelStatusBar < UIWindowLevelAlert
    b. UIWindowLevelNormal :暗中认可顶层层级
    c. UIWindowLevelStatusBar :状态栏、键盘
    d. UIWindowLevelAlert:UIAlertView 、UIActionSheet
    e. 把window 的层级设置成UIWindowLevelAlert ,就能展现在最前边了。
    f. 相通层级的窗口,想让里面几人展览馆示,能够用非常窗口的层级加上多个数
  7. 代码模仿main.storyboard 加载
    操作系统,self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    UIStoryboard * storyboard = [UIStoryboard storyboardWithName:@"main" bundle:nil];
    UIViewController * vc = [storyboard instantiateViewControllerWithIdentifier:@"B"]
    self.window.rootViewController = vc;

6. 窗口的层级

windowLevel: UIWindowLevelNormal < UIWindowLevelStatusBar < UIWindowLevelAlert

UIWindowLevelNormal : 暗中认可窗口的层级

UIWindowLevelStatusBar : 状态栏、键盘

UIWindowLevelAlert :UIActionSheet,UIAlearView

把window的层级设置为UIWindowLevelAlert ,就博览会示在最前方

如出风流倜傥辙层级的窗口,想让当中三个人展览馆示,能够用十分窗口的层级加上三个数

  1. 程序运转进度
    a. 张开程序
    b. 执行main 函数
    c. 结束程序
  2. 执行Main 函数
    a. UIApplicationMian 函数原型:UIKIT_EXTERN int UIApplicationMain(int argc, char *argv[], NSString * __nullable principalClassName, NSString * __nullable delegateClassName);
    b. UIApplicationMian 的最底层实现:
    (1卡塔尔国. 依照principalClassName 提供的类名,创立三个UIApplication 对象。
    1. UIApplication 代表三个应用程序
    2. UIApplication 平常用来做一些采纳等第的操作(app 的唤醒框,联网状态,打电话,展开网页,调控情况)
      (2卡塔尔(قطر‎. 按照delegateClassName 提供的类名,创制二个UIApplication 对象。
    3. 次第加载完成时调用:application:didFinishLaunchingWithOptions:
    4. 次第获取关节时调用:applicationDidBecomeActive:
    5. 次第步向后台时调用:applicationDidEnterBackgroup:
    6. 次第失去大旨时调用:applicationWillResignActive:
    7. 次第从后台踏入前台时调用:applicationWillEnterForegroup:
    8. 内部存款和储蓄器警示,大概要停止程序时调用:applicationDidReceviceMemoryWarning:
    9. 次第将要退出时调用:applicationWillTerminate:
      (3卡塔尔. 开启叁个主运转循环,它是保存程序从来运转,并处监护人件。
      (4卡塔尔. 加载info.plist 和运维图片,何况推断info.plist 有未有钦命Main.storyboard,假诺钦赐就去加载。
  3. application 隐讳状态栏
    (1State of Qatar. 设置Info.plist文件:加多健View controller-based status bar appearance,设置值为NO。
    (2). 创建application。
    (3卡塔尔国. 调用隐敝状态栏的不二等秘书技。
  4. 增补:反射机制
    反射机制的好处:要是类名用字符串表示,即便类名写错了,编辑器不会报错;通过反射机制类名写错了,编写翻译器报错。
    NSString * class = NSStringFromClass([AppDelegate class]);
    appDelegate * strClass = NSClassFromString(@"AppDelegate");

(五卡塔尔(قطر‎. 调控器的View

一、PCH 文件
PCH 是二个头文件,能被项目中的全部源文件分享和做客。

6. 哪些高效生成一个xib描述调整器的view

  1. 定义新的调节器的时候,勾选xib,会自动搞四个xib描述调节器的view
  2. 会自动生成四个和调节器同名的xib,並且个中安装好了

内存警报管理时,ViewWillUnload和ViewDidUnload不自然被调用,因为那是系统活动判别的

3. 怎么要保管日志输出

因为日志输出特别耗性能,经常发表的时候无需日志输出,独有调节和测验的时候才要求

/*
...表示能接收任何参数
__VA_ARGS__ 表示左边...的参数会替代到右边NSLog中
*/
#ifdef DEBUG // 调试阶段
#define HMLog(...)  NSLog(__VA_ARGS__)
#else // 发布阶段
#define HMLog(...)
#endif
  1. view的生命周期:只假设view开首的都以view的生命周期方法
    loadView:首回接纳view的时候调用
    viewDidLoad:调节器的view加载完毕的时候调用
    viewWillAppear:调整器的view将在突显的时候调用
    viewDidAppear:调节器的view完全突显的时候调用
    view威尔Disappear:调控器的view将要消失的时候调用
    viewDidDisappear:调节器的view完全消逝的时候调用
    view威尔LayoutSubviews:调整器的view就要构造的时候调用
    viewDidLayoutSubviews:调整器的view完全构造的时候调用
    viewWillUnload:调节器的view将在销毁
    viewDidUnload:调整器的view完全绝迹
  2. 内部存款和储蓄器警示管理
    a、处理进度

5. makeKeyAndVisible方法底层所做的事务

a. 把窗口设置成主窗口,如:application.keyWindow = self.window;

b. 突显窗口,如:self.window.hidden = NO;

c. 注意:尽管底层会做地点两步,但不鲜明是下边包车型大巴代码

有内部存款和储蓄器警报 -> 调用didReceiveMemoryWarning方法 -> 推断调节器的View存不
存在 ->
存在就判定能否被放走(剖断是或不是正值突显在分界面上卡塔尔国 -> 能释放就调用ViewWillUnload ->
统统自由后就调用ViewDidUnload

(2). 根据delegateClassName提供的类名,制造二个UIApplication的代理对象

a. 程序加载完结时调用:application:didFinishLaunchingWithOptions:

b. 程序得到关节时调用:applicationDidBecomeActive:

c. 程序走入后台时调用:applicationDidEnterBackground:

d. 程序失去主旨时调用:applicationWillResignActive:

e. 程序从后台回到前台时调用:applicationWillEnterForeground:

f. 内部存款和储蓄器警报,也许要不为已甚程序时调用:applicationDidReceiveMemoryWarning:

g. 程序将在退出时调用:applicationWillTerminate:

五、控制器view

d. 代码加载xib中描述调整器的view

  //创建窗口
  self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];

  // 方式一:明确initWithNibName:方法的两个参数
  //UIViewController *vc = [[ViewController alloc] initWithNibName:@"View" bundle:[NSBundle mainBundle]];
  // 方式二:initWithNibName:方法的两个参数,只明确第一个参数,省略第二个参数
  // bundle写nil时,系统默认[NSBundle mainBundle]
  //UIViewController *vc = [[ViewController alloc] initWithNibName:@"View" bundle:nil];
  // 方式三:initWithNibName:方法的两个参数都省略
  //UIViewController *vc = [[ViewController alloc] initWithNibName:nil bundle:nil];
  // 方式四:调用init方法
  UIViewController *vc = [[ViewController alloc] init];

  // 设置窗口的根控制器
  self.window.rootViewController = vc;

  // 设置程序的主窗口并显示窗口
  [self.window makeKeyAndVisible];
  1. PCH 文件的必要
    叁个宏恐怕头文件等,比相当多文书都亟需利用,怎么解决,搞个共用的头文件,同一时间导入那几个头文件。
  2. 作用
    a. 贮存一些共用的宏
    b. 寄存一些共用的头文件
    c. 管理日志的输入,自定义LOG
  3. 干什么要保管日志输出
    因为日志输出极其耗质量,平常公布的时候不供给日志输出,独有调节和测验的时候才须要。
  4. 注意
    在PCH 中写关于OC的不二秘籍,最佳放在#ifdef OBJC中,xcode 在各样OC文件中都定义了那几个宏,也就代表独有OC文件才有所这个宏,幸免了花色文件中有C文件报错。

(二). 执行main函数

int main(int argc, char * argv[]) {
    @autoreleasepool {
           // 第三个参数为nil时,默认是UIApplication类名    
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

c. 拖线钦命xib中哪些UIView是调控器的view

选中File`s Owner,右键单击后,在弹出的对话框上拖线

操作系统 1

操作系统 2

(1卡塔尔. 依据principalClassName提供的类名,创立一个UIApplication对象

a. UIApplication代表一个应用程序

b. UIApplication日常用来做一些运用级其余操作(app的唤起框,联网状态,打电话,打开网页,调节状态栏)

本文由ca88发布,转载请注明来源

关键词: ca88网址 日记本 加载 控制器 窗口