澳门新葡亰平台官网iOS常见文件及程序的启动原理

澳门新葡亰平台官网 6

意气风发. iOS兴致索然见文件

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

(一). Xcode6之前

  1. 创设项目,默许能够瞥见三个存放框架的文件夹
  2. info文件以工程文件名开端,如:第七个门类-Info.plist
  3. 种类中暗许有三个PCH文件
  1. PCH 文件的须要
    三个宏或许头文件等,相当多文书都亟需利用,怎么解决,搞个共用的头文件,同不常候导入那么些头文件。
  2. 作用
    a. 贮存一些共用的宏
    b. 贮存一些共用的头文件
    c. 管理日志的输入,自定义LOG
  3. 干什么要治本日志输出
    因为日志输出特别耗品质,日常发表的时候没有须要日志输出,唯有调节和测验的时候才须要。
  4. 注意
    在PCH 中写关于OC的措施,最棒放在#ifdef OBJC中,xcode
    在各种OC文件中都定义了这么些宏,也就意味着独有OC文件才有所这几个宏,制止了花色文件中有C文件报错。

(二). Xcode6之后(包括Xcode6)

  1. 创建项目,未有框架文件夹,使用时系统才去加载
  2. info文件不以工程文件名早先,如:Info.plist
  3. 类型中未有PCH文件

二、程序运转原理

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

  1. 成效:保存应用的消息,软件名称、版本号等等,也就是身份ID
  2. Bundle name:程序名称,无法当先13个字节
  3. Bundle versions string, short:APP版本号
  4. Bundle identifier:APP项目唯生机勃勃标记
  5. Bundle version:内部开拓人士使用的版本号
  6. Main storyboard file base name:第生机勃勃开发银行的storyboard文件
  7. 留意:图形化的Info.plist文件上面的KEY不是真实的KEY,要想看真正的KEY得看Info.plist文件的源码
    操作:Info.plist(选中后右键单击卡塔尔(قطر‎ -> Open As -> Source Code
  8. 代码查看版本号

NSDictionary *dicInfo = [NSBundle mainBundle].infoDictionary;
NSLog(@"%@",dicInfo[@"CFBundleShortVersionString"]);
  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 的平底达成:
    (1State of Qatar. 依照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卡塔尔国. 开启一个主运维循环,它是保存程序一直运行,并处监护人件。
      (4State of Qatar. 加载info.plist 和起步图片,並且判别info.plist
      有未有内定Main.storyboard,假使钦命就去加载。
  3. application 掩盖状态栏
    (1卡塔尔(قطر‎. 设置Info.plist文件:增加健View controller-based status bar
    appearance,设置值为NO。
    (2). 创建application。
    (3卡塔尔国. 调用蒙蔽状态栏的不二等秘书技。
  4. 补充:反射机制
    反射机制的裨益:假设类名用字符串表示,就算类名写错了,编辑器不会报错;通过反射机制类名写错了,编写翻译器报错。
    NSString * class = NSStringFromClass([AppDelegate class]);
    appDelegate * strClass = NSClassFromString(@”AppDelegate”);

(四). PCH文件

PCH文件是贰个头文件,能被项目中的其余全体源文件共享和访问

三、加载Main.storyboard

1. PCH文件的供给

叁个宏或头文件等,比比较多文件都亟需运用,怎么消除,搞个公用的头文件,同期导入那几个头文件

  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;

2. 作用

(1卡塔尔国. 寄存一些公用的宏
(2卡塔尔国. 存放一些公用头文件
(3卡塔尔. 管理日志的出口,自定义Log

四、通过XIB 创立调整器的View

3. 为啥要管住日志输出

因为日志输出特别耗质量,经常发表的时候不须求日志输出,独有调节和测量检验的时候才需求

/*
...表示能接收任何参数
__VA_ARGS__ 表示左边...的参数会替代到右边NSLog中
*/
#ifdef DEBUG // 调试阶段
#define HMLog(...)  NSLog(__VA_ARGS__)
#else // 发布阶段
#define HMLog(...)
#endif
  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的时候能够不安装尺寸,系统会自动安装;不是跟调整器就可怜;能够用CGEnclavectZeco表示,如: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,况兼当中安装好了

5. 注意

在PCH中写关于OC的语法,最棒放在 #ifdef __OBJC__
中,Xcode在各类OC文件中都定义了这些宏,也就表示唯有OC中的文件才有所这几个宏,幸免了种类中有C文件的时候报错。

五、控制器view

二. 程序的开发银行原理

  1. view的生命周期:只假如view伊始的都是view的生命周期方法
    loadView:第三遍接受view的时候调用
    viewDidLoad:调控器的view加载达成的时候调用
    viewWillAppear:调控器的view将在呈现的时候调用
    viewDidAppear:调整器的view完全呈现的时候调用
    viewWillDisappear:调节器的view将要消失的时候调用
    viewDidDisappear:调整器的view完全付之意气风发炬的时候调用
    viewWillLayoutSubviews:调整器的view将要布局的时候调用
    viewDidLayoutSubviews:调控器的view完全布局的时候调用
    viewWillUnload:调节器的view将要销毁
    viewDidUnload:调节器的view完全毁灭
  2. 内部存款和储蓄器警示管理
    a、管理进度

(黄金年代卡塔尔. 程序的启航进程

  1. 开采程序
  2. 执行main函数
  3. 利落程序

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

(二). 执行main函数

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

b、注意

1. UIApplicationMain函数的原型

UIKIT_EXTERN int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);

内部存款和储蓄器警示管理时,ViewWillUnload和ViewDidUnload不确定被调用,因为那是系统自动决断的

2. UIApplicationMain的底层达成

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

a. UIApplication代表贰个应用程序

b.
UIApplication日常用来做一些接收品级的操作(app的提示框,联网状态,打电话,打开网页,调节状态栏)

(2卡塔尔(قطر‎. 依据delegateClassName提供的类名,制造二个UIApplication的代理对象

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

b. 程序获取关节时调用:applicationDidBecomeActive:

c. 程序步向后台时调用:applicationDidEnterBackground:

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

e. 程序从后台回到前台时调用:application威尔EnterForeground:

f. 内部存款和储蓄器警示,也许要恰到好处程序时调用:applicationDidReceiveMemoryWarning:

g. 程序就要退出时调用:application威尔Terminate:

(3卡塔尔国. 开启一个主运维循环,它是保证程序一向在运行,并处总管件

(4卡塔尔. 加载Info.plist和起步图片,並且判别Info.plis有未有钦定Main.storyboard,假使内定,就去加载

3. application掩饰状态栏

a. 设置Info.plist文件:增多健View controller-based status bar
appearance,设置值为NO

b. 创建application

c. 调用隐蔽状态栏方法

4. 抵补:反射机制

反射机制好处:假设类名用字符串表示,纵然类名写错,编写翻译器不报错;假若因此反射机制,类名写错,编写翻译器报错

NSString *class =  NSStringFromClass([AppDelegate class]);
AppDelegate *strClass = NSClassFromString(@"AppDelegate");

(三). 加载Main.storyboard

1. 加载Main.storyboard步骤

a. 创造窗口

b. 加载Main.storyboard,并且加载Main.storyboard钦赐的调控器

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

2. 窗口(UIWindow)

a.
UIWindow是一个独运匠心的UIView,在二个应用软件中貌似都会有叁个UIWindows,但不光独有三个,如:软键盘也是二个窗口

b.
APP程序运行完成后,制造的率先个视图控件是UIWindow,接着创设调控器的View,最终将调控器的view增添到UIWindow上,于是调整器的view就显得在显示屏上

c. 一个应用软件之所以能突显到荧屏上,完全都是因为有UIWindow

d. UIScreen : 标志大要的显示器,它连接着设备

e. UIWindow : 用于提供显示屏绘制帮助的,提供了部分制图的不二等秘书诀

f. UIView :
窗口上有超多View,是用于提供绘图操作的,把画好的View增加到窗口上,就足以显得;显示器上的东西都以绘制上去的,刷新三回约等于重新绘制叁次

g.
只有加载Main.storyboard的时候才创造窗口(这里说的加载是系统自动加载)

h. 假设是温馨代码加载Main.storyboard,供给团结代码创设窗口

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. 窗口的层级

windowLevel: UIWindowLevelNormal < UIWindowLevelStatusBar <
UIWindowLevelAlert

UIWindowLevelNormal : 默许窗口的层级

UIWindowLevelStatusBar : 状态栏、键盘

UIWindowLevelAlert :UIActionSheet,UIAlearView

把window的层级设置为UIWindowLevelAlert ,就能够显得在最前面

同等层级的窗口,想让在那之中三个呈现,能够用极度窗口的层级加上贰个数

7. 代码模仿storyboard的加载

注:要习惯代码创制窗口和调整器,因为支付中超少用到storyboard直接支出,老品种中并未有storyboard

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

  // 加载storyboard
  // Main.storyboard文件名不用写后缀
  // 当写nil时,系统默认[NSBundle mainBundle]
  UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];

  //创建控制器
  //方式1:代码创建控制器
  //UIViewController *vc = [[UIViewController alloc] init];
  //vc.view.backgroundColor = [UIColor whiteColor];

  //方式2:加载storyboard里面有箭头的控制器
  //UIViewController *vc = [storyboard instantiateInitialViewController];
  // 当加载storyboard里面的控制器,控制器所属哪个类,就是创建哪个类
  //NSLog(@"%@",NSStringFromClass([vc class]));

  //方式3:storyboard里面有多个控制器,加载对应标识的控制器
  UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"B"];

  //创建窗口的根控制器
  self.window.rootViewController = vc;

  // 显示窗口
  [self.window makeKeyAndVisible];

(四卡塔尔. 通过XIB创立调控器的view

1. 步骤

a. 创立一个调控器的类

b. 成立叁个xib,并指定xib所描述的调节器,贰个xib只可以用来描述一个调整器,若无一点点名,就不可能拖线钦命调控器的view

瞩目:xib里可以有多少个UIView,无法牢固死

澳门新葡亰平台官网 1

c. 拖线钦点xib中哪些UIView是调节器的view

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

澳门新葡亰平台官网 2

澳门新葡亰平台官网 3

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];

2. 注意

独有调整器的init方法,底层才会调用initWithNibName:bundle:方法

3. view的创建

澳门新葡亰平台官网 4

a. 若是重写loadView,就依赖自定义的view创立view

b.
若无重写loadView,就去查看有未有storyboard,有storyboard,就依靠storyboard里描述的view创制;

c.
若无storyboard,就去查看有未有内定的xib,有钦命的xib,就借助xib里描述的view创立;

d.
如果未有一点名的xib,即nibName为nil时,就翻开有未有与xib的具备者同名的xib,但优选查看未有Controller的xib,假如查不到,就翻开有未有与xib的具有者完全同名的xib,如:xib的拥有者是ViewController,xib的文书名是View,就先行查看View.xib,依据它陈说的view创立;若无公文名叫View的xib,就去查看有没知名字为ViewController的xib,假诺有就依据xib里描述的view成立

e. 假诺上述的景况都并未有,就创办三个空的View

4. 调控器的loadView方法

A.
loadView的作用:自定义调节器的view,只要重写了这些格局,表明要本身创建view,就不会自动创立view

B.
loadView什么日期调用:第壹遍使用view的时候调用,调用那一个措施成立调控器的view。

C.
loadView默认做法:倘诺storyboard描述了调控器的view,就能去加载storyboard的view

D. 注意:

a. 只要重写loadView方法,没有调用系统默认的做法,即不写[super loadView],就不会去加载storyboard或者xib来描述控制器的view

b. 如果重写loadView方法,并且指定了nibName,loadView默认的做法会去加载xib的view

c. 只要重写loadView方法,没有指定nibName,就不会自动去加载和控制器同名的xib

d. 在重写loadView时,没有给self.view创建view,就使用self.view,会造成死循环

e. 如果是根控制器的view,自定义view的时候可以不设置尺寸,系统会自动设置;不是跟控制器就不行;可以用CGRctZeco表示,如:self.view = [[UIView alloc] initWithFrame: CGRctZeco];

f. 重写loadView方法时,不要写[super loadView];,因为重写该方法的目的是自定义view,重写了还要去加载storyboard里的view,
等于多此一举

5. xib和storyboard的区别

storyboard已经钦点了调整器的view,无需大家管,xib要求大家手动管理

6. 怎么着高效生成八个xib描述调整器的view

  1. 定义新的调整器的时候,勾选xib,会自行搞几个xib描述调控器的view
  2. 会自动生成叁个和调整器同名的xib,况且在那之中安装好了

(五卡塔尔. 调整器的View

1. view的生命周期

如固然View起始的都以View的生命周期方法

澳门新葡亰平台官网 5

loadView:第一回采纳view的时候调用

viewDidLoad:调控器的view加载完毕的时候调用

viewWillAppear:调控器的view即将展现的时候调用

viewDidAppear:调整器的view完全展现的时候调用

viewWillDisappear:调控器的view就要消失的时候调用

viewDidDisappear:调控器的view完全没不常调用

viewWillLayoutSubviews:调控器的view将要布局的时候调用

viewDidLayoutSubviews:调整器的view完全构造的时候调用

viewWillUnload:调节器的view将要销毁

viewDidUnload:调控器的view完全绝迹

2. 内部存款和储蓄器警示管理

澳门新葡亰平台官网 6

a. 管理进度

有内部存储器警示 -> 调用didReceiveMemoryWarning方法 ->
剖断控制器的View存不设有 ->
存在就推断能还是无法被放走(判定是或不是正值突显在分界面上卡塔尔(قطر‎ ->
能释放就调用View威尔Unload -> 完全自由后就调用ViewDidUnload

b. 注意

内部存款和储蓄器警示管理时,ViewWillUnload和ViewDidUnload不必然被调用,因为那是系统活动判别的

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图