iOS开发之main函数参数的解析

原创 2016年08月29日 18:38:48

在工程的Supporting Files文件夹中,有一个main函数

int main(int argc, char * argv[]) {
    @autoreleasepool {

        /**
         *  argc,argv是C标准main函数的参数,直接传递给UIApplicationMain进行相关处理即可;
         principalClassName:指定应用程序类,该类必须是UIApplication类或其子类。如果为nil,则用UIApplication类作为默认值
         delegateClassName:指定应用程序类的代理类,该类必须遵循UIApplicationDelegate协议,此函数会根据principalClassName创建UIApplication对象,根据delegateClassName创建一个delegate对象,并将该delegate对象赋值给UIApplication对象中的delegate属性。UIApplication对象会依次给delegate对象发送不同的消息,接着会创建应用程序的main runloop(事件循环),进行事件的处理(首先会调用delegate对象的 application:didFinishLaunchingWithOptions : ) 程序正常退出时这个函数才返回。
         UIApplication 对象管理事件循环和高层的应用行为
         应用委托是应用的核心,该对象与UIApplication对象联合起来负责对应用的初始化过程、状态迁移过程和很多高层的应用事件进行处理

         */
     return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

AppDelegate是应用程序委托对象,它继承于UIResponder,并且遵循了UIApplicationDelegate协议

#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@end

应用程序的生命周期

/**
 *  
 *  作为应用程序的委托对象,AppDelegate类在应用的生命周期的不同阶段会回调不同的方法
 *
 *  此类本身没有任何功能代码,它的作用就是实现了UIAplication和iOS操作系统之间的协议。该协议的方法就对应UIAplication在操作系统中的各种状态。
 *  iOS应用的五种状态:
 *  Not Runing(非运行状态)   应用没有运行或者被系统终止
 *  Inactive(前台非活跃状态) 应用进入前台状态,但是还不能接收事件处理
 *  Active(前台活跃状态)     应用进入前台状态,能接收事件处理
 *  Background(后台状态)    应用进入后台状态,依然能够执行代码。如果有可以执行的代码,就会执行代码,如果没有可以执行的代码或者将可执行的代码执行完毕,应用就会马上进入挂起状态。
 *  Suspended(挂起状态)     应用进入一种‘冷冻’状态,不能执行代码。如果系统的内存不足,应用会被终止。
 */

以下是遵循方法UIApplicationDelegate协议实现的方法

//应用启动并进行初始化的时候会调用该方法,并发出通知。在这个阶段会初始化根视图控制器。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    NSLog(@"应用启动并进行初始化");
    return YES; 
} 
//应用从活跃状态到非活跃状态时调用该方法,并发出通知。这个阶段可以保存UI状态。
- (void)applicationWillResignActive:(UIApplication *)application {
    NSLog(@"应用从活跃状态到非活跃状态");
}
//应用进入后台时调用该方法并发出通知。这个阶段可以保存用户数据,释放一些资源。
- (void)applicationDidEnterBackground:(UIApplication *)application {
    NSLog(@"应用进入后台");
}
//应用进入前台,但是还没处于活跃状态时调用方法并发出通知。这个阶段可以恢复用户数据。
- (void)applicationWillEnterForeground:(UIApplication *)application {
    NSLog(@"应用进入前台,但是还没处于活跃状态");
}
//应用进入前台,处于活跃状态调用该方法并发出通知,这个状态可以保存UI状态。
- (void)applicationDidBecomeActive:(UIApplication *)application {
    NSLog(@"应用进入前台,处于活跃状态");
}
//应用终止时调用该方法。
- (void)applicationWillTerminate:(UIApplication *)application {
    NSLog(@"应用终止");
}

应用启动并进行初始化的时候会调用该方法,并发出通知。在这个阶段会初始化根视图控制器。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    NSLog(@"应用启动并进行初始化");
    //初始化一个window对象
    self.window = [[UIWindow alloc] init];
    //创建一个screen并取其bounds属性再赋值给window的frame属性
    self.window.frame = [UIScreen mainScreen].bounds;
    //设置窗口背景颜色backgroundColor
    self.window.backgroundColor = [UIColor yellowColor];
    //使当前的窗口作为主窗口并显示在屏幕最前端
    [self.window makeKeyAndVisible];
    //把ViewController的对象作为window的根视图控制器(rootViewController),没有则会报错
    self.window.rootViewController = [[ViewController alloc] init];//不带xib的方法

//切换根视图控制器,让AViewControler作为window的根视图控制器(AViewControler是新创建的一个类,下面BViewController同理)
    self.window.rootViewController = [[AViewControlerViewController alloc] init];//没有设置颜色,默认为黑色

//带xib的方法,在创建时选中‘Also creat XIB file’
    BViewController *bVC = [[BViewController alloc] initWithNibName:@"BViewController" bundle:[NSBundle mainBundle]];
    self.window.rootViewController = bVC;

创建一个AppD类,替换NSStringFromClass([AppDelegate class])中的AppDelegate,让AppD作为UIAplication的委托对象

//需要遵循协议
@interface AppD : UIResponder<UIApplicationDelegate>
//创建window属性
@property (nonatomic,strong)UIWindow *window;

@end

//在AppD实现文件
//应用启动并进行初始化的时候会调用该方法,并发出通知。在这个阶段会初始化根视图控制器。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
    //初始化window对象
    self.window = [[UIWindow alloc] init];
    //设置大小
    self.window.frame = [UIScreen mainScreen].bounds;
    //设置当前window为主窗口并显示在最前端
    [self.window makeKeyAndVisible];
   //创建ViewController对象,这是初始化一个什么控件都不带的对象
 ViewController *vc = [[ViewController alloc] init];
    //通过UIStoryboard创建一个storyboard对象
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
    //实例化一个ViewController对象,并带有一些需要的控件
    ViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"ViewController"];//(storyboard导航面板/Show the identity inspector/storyboard ID)
    //添加根视图控制器    
    self.window.rootViewController = vc;

    return  YES;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

IOS程序启动时main函数前执行的部分-load方法和静态函数

1 load部分 1.1 调用堆栈 frame #0: MyApp`+[XXX load] frame #1: libobjc.A.dylib`call_load_methods + ...
  • demondev
  • demondev
  • 2016年08月28日 19:03
  • 1391

带命令行参数的main函数详解[转载]

一、main()函数的形式     在最新的 C99 标准中,只有以下两种定义方式是正确的:  (参阅ISO/IEC 9899:1999 (E) 5.1.2.2.1 Program s...
  • htyurencaotang
  • htyurencaotang
  • 2013年11月25日 17:32
  • 6049

Linux C编程 main函数参数解析

我们经常用的main函数都是不带参数的。因此main 后的括号都是空括号。实际上,main函数可以带参数,这个参数可以认为是 main函数的形式参数。C语言规定main函数的参数只能有两个, 习惯上这...
  • wangkai_123456
  • wangkai_123456
  • 2014年03月19日 14:42
  • 1910

main函数参数的解析及应用

我们平时在使用main函数的时候是很少注意main函数的参数,但实际上main函数是有参数的,main函数是由系统调用,在调用的同时传参。 main函数的参数原型:int main(int argc...
  • wwwwangjing
  • wwwwangjing
  • 2017年05月24日 19:11
  • 171

Linux C编程--main函数参数解析

我们经常用的main函数都是不带参数的。因此main 后的括号都是空括号。实际上,main函数可以带参数,这个参数可以认为是 main函数的形式参数。C语言规定main函数的参数只能有两个, 习惯上这...
  • zz460833359
  • zz460833359
  • 2015年12月25日 15:00
  • 255

main函数参数解析

main函数可以不带参数,也可以带参数,这个参数可以认为是 main函数的形式参数。C语言规定main函数的参数只能有两个,习惯上这两个参数写为argc和argv。因此,main函数的函数头可写为: ...
  • zhanghaodx082
  • zhanghaodx082
  • 2012年12月12日 22:15
  • 382

main函数参数解析

int argc,char *argv agrc表示参数的个数 argv储存参数 这个函数的意思是逐一输出参数 实际上,main函数也可以带参数。带参数main函数的定义格式如下...
  • jhp1900
  • jhp1900
  • 2014年06月11日 22:03
  • 435

Linux C编程--main函数参数解析 .

摘自:http://blog.csdn.net/dlutbrucezhang/article/details/8622591   我们经常用的main函数都是不带参数的。因此main 后的括号都是...
  • scdxmoe
  • scdxmoe
  • 2013年10月29日 20:11
  • 527

Linux C编程--main函数参数解析

我们经常用的main函数都是不带参数的。因此main 后的括号都是空括号。实际上,main函数可以带参数,这个参数可以认为是 main函数的形式参数。C语言规定main函数的参数只能有两个, 习惯上这...
  • DLUTBruceZhang
  • DLUTBruceZhang
  • 2013年02月28日 16:11
  • 17083

实现计算器

实现一个计算器功能 //方式一 用main参数列表的方式实现#include #include int Add(int x,int y) { return x+y; }int Sub(in...
  • kai29
  • kai29
  • 2017年11月05日 22:22
  • 87
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS开发之main函数参数的解析
举报原因:
原因补充:

(最多只允许输入30个字)