而是在main函数中大家其实只好见到二个办法,可

2019-09-13 11:20栏目:大奖888官网登录
TAG:

  • instancetype:会自动识别当前格局是哪些类在调用,自动转变到该类
  • className: 子类调用的的时候会不相配
  • id:不可能运用点语法;能够调用任何对象的不二等秘书诀,不平价代码的检查
次第运维逻辑

应用Xcode张开三个连串,很轻松会发觉贰个文书--main.m文件,此处正是选取的入口了。程序运转时,施夷光行main函数,main函数是ios程序的入口点,内部会调用UIApplicationMain函数,UIApplicationMain里会成立三个UIApplication对象 ,然后创设UIApplication的delegate对象 —–(您的)AppDelegate ,开启三个消息循环(main runloop),每当监听到对应的体系事件时,就能够通报AppDelegate。

UIApplication对象是应用程序的意味,每二个选择皆有本身的UIApplication对象,何况是单例的。通过[UIApplication sharedApplication]能够获得那一个单例对象,二个iOS程序运转后创制的首先个指标正是UIApplication对象, 利用UIApplication对象,能实行局地利用级其他操作。
第八个参数表示参数的个数,第三个参数表示装载函数的数组,第一个参数,是UIApplication类名或其子类名,就算nil,则默许使用UIApplication类名。第多少个参数是切磋UIApplicationDelegate的实例化对象名,那几个目的便是UIApplication对象监听到系统生成的时候布告其奉行的应和措施。

开发银行实现会调用 didFinishLaunching方法,并在这一个格局中成立UIWindow,设置AppDelegate的window属性,并设置UIWindow的根调节器。假若有storyboard,会依据info.plist中找到应用程序的入口storyboard并加载箭头所指的调节器,展现窗口。storyboard和xib最大的例外在于storyboard是依照试图调控器的,而非视图或窗口。展现以前会将增添rootViewController的view到UIWindow下边(在这一步才会创立调节器的view)

图片 1

未使用storyboard的启动

次第运转的欧洲经济共同体进程如下:

1.main 函数

2.UIApplicationMain

  • 创建UIApplication对象

  • 创建UIApplication的delegate对象

  • delegate对象初步拍卖(监听)系统事件(未有storyboard)

  • 程序运营达成的时候, 就能够调用代理的application:didFinishLaunchingWithOptions:方法

  • 在application:didFinishLaunchingWithOptions:中开创UIWindow(这一个地点你须要设置window的属性 大小 颜色 )

![](https://upload-images.jianshu.io/upload_images/1540977-fbab5b6e5f60302a.png)

初始化UIWindow
  • 始建和设置UIWindow的rootViewController

图片 2

开创根试图

  • 展现窗口

3.基于Info.plist得到最关键storyboard的文本名,加载最注重的storyboard(有storyboard)

  • 创建UIWindow

  • 开创和设置UIWindow的rootViewController

  • 显示窗口

iOS程序概要

UIPickView联动BUG:

在UIPickView快捷轮转的时候,[self.pickView selectedRowInComponent:0]回来的行号会快捷转移,与此同临时间,- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component代理方法也会加载对应的要联合浮动的列的数量,但是,那一年由于后边重返的行号火速转移,导致立异title的时候,行号与实际的行号分歧,或然在取多少的时候,导致数据数组越界;

  1. 任何程序首先会调用main函数,iOS同样首先会调用main.m文件之中的main函数,int main(int argc, char * argv[])

  2. 在main函数中会调用UIApplicationMain(argc, argv, principalClassName, delegateClassName函数;函数全程int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);

    • principalClassName: UIApplication或许它的子类的名称,假若传nil,表示 UIApplication;
    • delegateClassName:传入程序代理的的类名

在这几个函数中会创立UIApplication对象和AppDelegate对象

  1. 开启主运维循环,监听系统事件
  2. 读取应用程序的info.plist文件,决断是不是有main文件(main.storyboard可能其余内定早先化加载的storyboard文件)
  • 有内定的storyboard(系统会本身做一些事务)
    • 系统第一成立叁个UIWindow对象
    • 然后把window设置为AppDelegate的window属性值
    • 再安装 storyboard或xib对应的调整器设置为window的rootViewcontroller(会活动将rootViewcontroller.view加到window上)
    • 最后将window设置为application的主窗口并展现出来[window makeKeyAndVisible]
  • 未曾点名的storyboard(大家要手动在程序运行实现做一些操作)
    • 创办AppDelegate的window,和荧屏尺寸一致
    • 安装window的rootViewcontroller(会活动将rootViewcontroller.view加到window上)

而是在main函数中大家其实只好见到二个办法,可是不能够响应广大事变。在- application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中开展设置

注意点:为啥绝对要将调整器设置为window的rootViewcontroller?

因为:唯有viewcontroller技艺响应一些种类事件,比方显示屏的团团转。借使单独将viewcontroller.view增添到window上面,会显得内容,不过不能够响应广大风浪。

应用程序创造的第一个控件。在AppDelegate中提供了多个UIWindow对象的接口,正是应用程序供给体现的故事情节的载体,以往要出示的剧情最棒放在此处

  • window.hidden = NO 就能够显示window
  • 安装window.windowLevel就足以设置window的层级(除了对应枚举,还是能够对应数值)

加载格局:[[LJViewController alloc]initWithNibName: bundle:]

  • nibName:传nib文件名,加载钦点的nib文件;传nil的话:
    • 先是会招来与类名相似未有controller字样nib文件(这里会是LJView.xib)
    • 假如未有找到,就能招来与类名同名的xib文件(这里是LJViewController.xib)
    • 固然依旧未有找到,就能够给调整器创设贰个空的view,这些空的view大致是晶莹剔透的,但不是一心透明的。留意:客户能够穿过完全透明的view实行操作;clearColor并非一心透明的
AppDelegate的代理方法
//app启动完毕后就会调用
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
}

//app程序失去焦点就会调用                    
- (void)applicationWillResignActive:(UIApplication *)application
{
}

//app进入后台的时候调用, 一般在这里保存应用的数据(游戏数据,比如暂停游戏)
- (void)applicationDidEnterBackground:(UIApplication *)application
{
}

//app程序程序从后台回到前台就会调用
- (void)applicationWillEnterForeground:(UIApplication *)application
{
}

//app程序获取焦点就会调用
- (void)applicationDidBecomeActive:(UIApplication *)application
{
 }

// 内存警告,可能要终止程序,清除不需要再使用的内存
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
{
}

// 程序即将退出调用
- (void)applicationWillTerminate:(UIApplication *)application
{
}

1. 前后相继的启航进度

iOS程序正是从main函数初阶进行的,但是在main函数中大家其实只好看看三个措施,这一个法子内部是三个新闻循环(相当于三个死循环),因而运维到这些方法UIApplicationMain之后前后相继不会自行退出,而独有当客户手动关闭程序那一个轮回才结束。

具体顺序: main函数 -> 实行里面包车型地铁UIApplicationMain函数(创设UIApp和装置其代理)->开启主事件循环,加载Info配置文件. -> 剖断是不是钦赐storyboard.

图片 3

041940347874363.png

  • 扩充main函数实施 UIApplicationMain(argc, argv, nil, NSStringFromClass( [AppDelegate class] ) );有七个参数:
    • 先是个参数和第二个参数其实正是main函数的参数,分别代表:参数个数、参数内容;
    • 其多个参数代表UIApplication类(或子类)字符串,那几个参数默以为nil则代表默认为UIApplication类,UIApplication是单例方式;
    • 第七个参数是UIApplication的代办类字符串,暗许生成的是AppDelegate类,那些类重要用于监听整个应用程序生命周期的依次事件;
  1. 创设UIApplication对象:UIApplication是应用程序的意味,应用程序运维的首先个创立的单例对象,跟应用品级的系统装置都归其承受,比方电话,短信,联网等.

图片 4

051434294903548.png

  1. 开创了AppDelegate: 应用程序代理,主要用于监听整个应用程序生命周期中逐一阶段的风云;

    • 负有活动过操作系统都有个沉重的通病,app程序很轻便蒙受扰乱,比方来电,切换.
    1. app受到滋扰,会产生部分类别事件,这是,UIApp会布告代理,让代理来拍卖那几个事.(应用程序生命周期,系统事件,内存警告)
搭建框架的难题
  • 大家得以写三个AppDelegate的类目 然后在在AppDelegate didFinishLaunchingWithOptions里面调用类目里面包车型地铁措施,创制三个BaseTabBarController 将你抱有tabrBarController调整器放在里面,然后将appDelegate里面window的rootViewController 写成BaseTabBarController 就能够了。

2. 文件结构.

  1. Appdelegate(.h/.m):应用程序代理,用于监听整个应用程序的生命周期事件
  2. ViewController: 视图调节器,首要负担管理UIView的生命周期, 切换和事件监听.
  3. Main.storyboard: 分界面布局文件,承载对应UIView的视图控件(二进制)
  4. Info.plist:程序配置文件
  5. main.m 应用程序入口函数文件
  6. .pch : xcode5在此以前 公共头文件,贮存全局宏/自定义全局打字与印刷log等
//如:
    #define Log(...) NSLog(__VA_ARGS__)   //...表示宏里可变参数.  _VA表示函数里可变参数.这样在调试阶段可以打印断言,发布阶段就可直接宏定义为空,不需要找到每一个删除.
    #ifdef DEBUG 
    #define Log(...)  NSLog(__VA_ARGS__)
    #else 
    #define Log(...)
    #endif 
    //自动判别调试阶段,系统会自定义DEBUG宏,上例可以在调试阶段结束自动定义Log为空.
    #ifdef __OBJC__  //判断当前文件是否是OC文件 ,可以把引入的框架#import放里面.
AppDelegate加载顺序

1.application:didFinishLaunchingWithOptions:
2.applicationDidBecomeActive:

图片 5

纯代码完结iOS开采

在此以前方的程序运行进程能够:

  1. main 中UIApplicationMain(argc, argv, nil, NSStringFromClass( [AppDelegate class] ) );
    • 首先个参数是系统或客商传入参数个数.
    • nil表示暗中认可UIApplication或其子类.
    • NSStringFromClass-反射机制,把类名调换来字符串,
  2. UIApplicationMain中张开的步骤:
    • 成立开端化UIApplication对象
    • 创制AppDelegate并安装为app代理.
    • 展开事件循环--保证程序不脱离/监听事件
    • 加在Info配置文件,
  3. 推断: 借使钦点了storyboard,系统自动加载并创设UIWindow和根控制器,并显示主窗口.
ARC境况下viewController的生命周期

1.loadView
2.viewDidLoad
3.viewWillAppear
4.viewWillLayoutSubviews
5.viewDidLayoutSubviews
6.viewDidAppear

1. 纯代码开拓下开创调整器

未有一点名的SB(项目布局中).须要大家在UIAppDelegate中手动加载创设window和根调整器(三种创造格局)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//1. 创建UIWindow 设置为keyWindow显示主窗口.
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// 设置为keyWindow并显示主窗口.
    [self.window makeKeyAndVisible];
//2. 创建控制器并设为keyWindow的根控制器
    // 创建控制器有三种方式: 选择其中一种.
          //2.1 直接纯代码创建控制器
          ViewController *vc = [[UIViewController alloc] init];
          //2.2 从非指定storyboard中加载
          UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"文件名" bundle:nil ]
         ViewController *vc = [storyboard instantiateInitialViewController]
         //ViewController *vc =  [storyboard  instantiateInitialViewControllerWithIdentifier@“sb标示“] 
        //2.3 或从xib中实例化
         vc =[[UIViewController alloc] initWithNibName:@"xib文件名" bundle:nil]
}
ARC意况下View的生命周期

1.initWithCoder(如果未有storyboard就能调用initWithFrame,这里二种办法就是一种)
2.awakeFromNib
3.layoutSubviews
4.drawRect

2. 创设调控器的View
  • 系统会展开推断: 有没有钦命的SB,假若有,会自动加载描述的view
  • 万一未有一点名的SB,会挨个 判别有未有钦赐的xib,有没有同名的xib, 有未有减去Controller的同名xib;假诺都不曾,才会创建贰个空的View
  • 小心:以上推断都以系统自动进行的,不过一旦大家重写了loadView方法,系统就不会开展判别,而大家得以在里面成立自定义的view

是因为iOS的推移加载性子,loadView会在view第一次使用为nil的时候调用,额外:调控器View大概透明.(词如意)依然实体,假诺完全透明就恍如掩饰效果,会穿透点击.

有个别办法的利用机遇
+ (void)load;

应用程序运行就能调用的格局,在那个措施里写的代码最早调用。

+ (void)initialize;

用到本类时才调用,那个法子里一般设置导航调整器的主旨等,如若在末端的章程设置导航栏大旨就太迟了!

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions;

本条方法里面会成立UIWindow,设置根调整器并显现,譬喻一些应用程序要加载授权页面也是在那加,也能够安装观望者,监听到布告切换根调整器等。(使用Xib开始化后会调用此方法,一般不会重写此方法;)

- (void)awakeFromNib;

在选用IB的时候才会提到到此方法的施用,当.nib文件被加载的时候,会发送贰个awakeFromNib的新闻到.nib文件中的各个对象,每种对象都能够定义本身的awakeFromNib函数来响应那几个消息,施行一些少不了的操作。在这么些方法里安装view的背景等一层层普通操作(假使运用Xib创制ViewController,就绝不重写该措施。一般不会修改此情势;)

- (void)loadView;

成立视图的档期的顺序结构,在一直不开创调控器的view的图景下不可能一直写 self.view 因为self.view的最底层是

if(_view == nil){
_view = [self loadView]
}

如此写会平昔导致死循环。

比如重写那些loadView方法里面什么都不写,会呈现黑屏。

- (void)viewWillLayoutSubviews;

视图就要布局子视图,苹果提议的设置分界面布局属性的主意,那些措施和viewWillAppear里,系统的最底层都以平昔不写任何代码的,也等于说那中间不写super 也是足以的。

 - (void)layoutSubviews;

在那几个点子里一般设置子控件的frame。

- (void)drawRect:(CGRect)rect;

视图加载成功之后被调用,这一个格局很珍爱,能够在此增添部分投机定义的控件,注意此时view的frame不分明是显示时候的frame,真实的frame会在- (void)viewDidAppear: 后。
在iOS6.0+版本中在对象的满贯生命周期中只会被调用一回,这里要留目的在于iOS3.0~iOS5.X版本中只怕会被再次调用,当ViewController收到内部存储器警告后,会放出View,并调用viewDidUnload,之后会再次调用viewDidLoad,所以要辅助iOS6.0在此以前版本的童鞋要留神这里的内部存款和储蓄器管理。

- (void)viewDidLoad

调控器View的生命周期

依次如下(调用时先super父类方法.):
LoadView-加载view
ViewDIdLoad-完全加载时调用

viewWillAppear-将要显示
viewDidAppear-完全呈现

viewWillDisappear-将要消失(非销毁,那么不会加载)
viewDidxxxx-完全付之一炬

类相关方法

+(void)load

当三个类被加载时调用,只加载二次

+(void)initialize

当本类恐怕子类被加载时调用,大概调用数次

-(instancetype)init

用代码创造类的时候调用,只可以做一些初阶化操作,无法安装控件的frame,init其实是去调用initWithFrame,只然则frame为CGRectZero

-(instancetype)initWithFrame:(CGRect)frame

用代码创立类的时候调用,只可以做一些初阶化操作,不能够在那设置控件的frame,假如已经知道了frame,那么在这里设置子控件的frame是从未有过难题的,不过假若外部使用init的办法创设,最后也会调用initWithFrame方法,此时的frame传进来是0,那么,在那些格局里面安装的子控件的frame也会为0.所以,为了严俊起见,最佳不用在那么些法子里面设置子控件的frame。

-(instancetype)initWithCoder:(NSCoder *)aDecoder

从xib/storyboard中加载就能调用此措施,只好在那么些艺术做一些叁回性设置,不可能设置控件的frame

-(void)awakeFromNib

从文件中加载.就能调用此格局,能够在那几个点子中安装frame

-(void)layoutSubviews

一旦你想退换子视图的默许布局时才供给去重写 layoutSubviews 方法。

上学作品摘录 http://www.jianshu.com/p/231b1cebf477 笔者吴白

自家个人微信公众号地址(喜欢记得关切)

图片 6

辛小几位微信公众号地址

UIView

  1. 分界面上具备可知控件都以承继自UIView 的,富含UIWindow
  2. 一个选取中务必有叁个主窗口(能够有多少个UIWindow,唯有主窗口手艺和客商交互),UIWindow中必得有一个根调控器(亟需稳重的是,rootViewController和addSubView三种艺术设置调节器到window上并不完全等同,仅仅是add上去的,能够展现,但不协理旋转)
  3. UIViewController担当调整个中view的生命周期,切换,监听事件;
view内部存款和储蓄器警告管理:

非ARC下:

会调用viewWillUnLoad和ViewDidUnLoad方法.在did里面使self.datas = nil(iOS6.0之前).

iOS6之后.

ReceiveMemoryWarning {
 [super xxx];
 if([self isViewLoaded]&& self.view.window == nil) {
   self.view = nil; 
  }//只释放view,其余图层所耗资源不多,不用删
}

版权声明:本文由大奖888-www.88pt88.com-大奖888官网登录发布于大奖888官网登录,转载请注明出处:而是在main函数中大家其实只好见到二个办法,可