2019独角兽企业重金招聘Python工程师标准>>>

一、UIApplication

1.简单介绍

(1)UIApplication对象是应用程序的象征,一个UIApplication对象就代表一个应用程序。

(2)每一个应用都有自己的UIApplication对象,而且是单例的,如果试图在程序中新建一个UIApplication对象,那么将报错提示。

(3)通过[UIApplication sharedApplication]可以获得这个单例对象

(4) 一个iOS程序启动后创建的第一个对象就是UIApplication对象,且只有一个(通过代码获取两个UIApplication对象,打印地址可以看出地址是相同的)。

(5)利用UIApplication对象,能进行一些应用级别的操作

2.应用级别的操作示例:

1)设置应用程序图标右上角的红色提醒数字(如QQ消息的时候,图标上面会显示1,2,3条新信息等。)

@property(nonatomic) NSInteger applicationIconBadgeNumber;

代码实现和效果:

- (void)viewDidLoad
{[super viewDidLoad];    //创建并添加一个按钮UIButton *btn=[[UIButton alloc]initWithFrame:CGRectMake(100, 100, 60, 30)];[btn setTitle:@"按钮" forState:UIControlStateNormal];[btn setBackgroundColor:[UIColor brownColor]];[btn addTarget:self action:@selector(onClick) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:btn];
}
-(void)onClick
{NSLog(@"按钮点击事件");    //错误,只能有一个唯一的UIApplication对象,不能再进行创建//    UIApplication *app=[[UIApplication alloc]init];    //通过sharedApplication获取该程序的UIApplication对象UIApplication *app=[UIApplication sharedApplication];    app.applicationIconBadgeNumber=123;}

2)设置联网指示器的可见性

@property(nonatomic,getter=isNetworkActivityIndicatorVisible) BOOL networkActivityIndicatorVisible;

代码和效果:

  //设置指示器的联网动画app.networkActivityIndicatorVisible=YES;

3)管理状态栏

从iOS7开始,系统提供了2种管理状态栏的方式

a.通过UIViewController管理(每一个UIViewController都可以拥有自己不同的状态栏).

在iOS7中,默认情况下,状态栏都是由UIViewController管理的,UIViewController实现下列方法就可以轻松管理状态栏的可见性和样式

状态栏的样式     - (UIStatusBarStyle)preferredStatusBarStyle;

状态栏的可见性  -(BOOL)prefersStatusBarHidden;

#pragma mark-设置状态栏的样式
-(UIStatusBarStyle)preferredStatusBarStyle
{    //设置为白色    //return UIStatusBarStyleLightContent;    //默认为黑色return UIStatusBarStyleDefault;
}#pragma mark-设置状态栏是否隐藏(否)
-(BOOL)prefersStatusBarHidden
{    return NO;
}

b.通过UIApplication管理(一个应用程序的状态栏都由它统一管理)

如果想利用UIApplication来管理状态栏,首先得修改Info.plist的设置

代码:

  //通过sharedApplication获取该程序的UIApplication对象UIApplication *app=[UIApplication sharedApplication];app.applicationIconBadgeNumber=123;    //设置指示器的联网动画app.networkActivityIndicatorVisible=YES;    //设置状态栏的样式    //app.statusBarStyle=UIStatusBarStyleDefault;//默认(黑色)    //设置为白色+动画效果[app setStatusBarStyle:UIStatusBarStyleLightContent animated:YES];    //设置状态栏是否隐藏app.statusBarHidden=YES;      //设置状态栏是否隐藏+动画效果[app setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];

c.补充

既然两种都可以对状态栏进行管理,那么什么时候该用什么呢?

如果状态栏的样式只设置一次,那就用UIApplication来进行管理;

如果状态栏是否隐藏,样式不一样那就用控制器进行管理。

UIApplication来进行管理有额外的好处,可以提供动画效果。

4)openURL:方法

UIApplication有个功能十分强大的openURL:方法

- (BOOL)openURL:(NSURL*)url;

openURL:方法的部分功能有

打电话  UIApplication *app = [UIApplicationsharedApplication]; [app openURL:[NSURLURLWithString:@"tel://10086"]];

发短信  [app openURL:[NSURLURLWithString:@"sms://10086"]];

发邮件  [app openURL:[NSURLURLWithString:@"mailto://12345@qq.com"]];

打开一个网页资源 [app openURL:[NSURLURLWithString:@"http://ios.itcast.cn"]];

打开其他app程序   openURL方法,可以打开其他APP。

URL补充:

URL:统一资源定位符,用来唯一的表示一个资源。

URL格式:协议头://主机地址/资源路径

网络资源:http/ ftp等   表示百度上一张图片的地址   http://www.baidu.com/images/20140603/abc.png

本地资源:file:///users/apple/desktop/abc.png(主机地址省略)

二、UIApplication Delegate

1.简单说明

所有的移动操作系统都有个致命的缺点:app很容易受到打扰。比如一个来电或者锁屏会导致app进入后台甚至被终止。

还有很多其它类似的情况会导致app受到干扰,在app受到干扰时,会产生一些系统事件,这时UIApplication会通知它的delegate对象,让delegate代理来处理这些系统事件。

作用:当被打断的时候,通知代理进入到后台。

每次新建完项目,都有个带有“AppDelegate”字眼的类,它就是UIApplication的代理,NJAppDelegate默认已经遵守了UIApplicationDelegate协议,已经是UIApplication的代理。

2.代理方法

 1 #import "YYAppDelegate.h" 2  3 @implementation YYAppDelegate 4  5 // 当应用程序启动完毕的时候就会调用(系统自动调用) 6 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 7 { 8     NSLog(@"didFinishLaunchingWithOptions"); 9     return YES;10 }11 12 // 即将失去活动状态的时候调用(失去焦点, 不可交互)13 - (void)applicationWillResignActive:(UIApplication *)application14 {15     NSLog(@"ResignActive");16 }17 18 // 重新获取焦点(能够和用户交互)19 - (void)applicationDidBecomeActive:(UIApplication *)application20 {21     NSLog(@"BecomeActive");22 }23 24 // 应用程序进入后台的时候调用25 // 一般在该方法中保存应用程序的数据, 以及状态26 - (void)applicationDidEnterBackground:(UIApplication *)application27 {28     NSLog(@"Background");29 }30 31 // 应用程序即将进入前台的时候调用32 // 一般在该方法中恢复应用程序的数据,以及状态33 - (void)applicationWillEnterForeground:(UIApplication *)application34 {35     NSLog(@"Foreground");36 }37 38 // 应用程序即将被销毁的时候会调用该方法39 // 注意:如果应用程序处于挂起状态的时候无法调用该方法40 - (void)applicationWillTerminate:(UIApplication *)application41 {42 }43 44 // 应用程序接收到内存警告的时候就会调用45 // 一般在该方法中释放掉不需要的内存46 - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application47 {48     NSLog(@"MemoryWarning");49 }50 @end

应用程序一般有五个状态:官方文档app.states

三、程序启动原理

UIApplicationMain

main函数中执行了一个UIApplicationMain这个函数

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

argc、argv:直接传递给UIApplicationMain进行相关处理即可

principalClassName:指定应用程序类名(app的象征),该类必须是UIApplication(或子类)。如果为nil,则用UIApplication类作为默认值

delegateClassName:指定应用程序的代理类,该类必须遵守UIApplicationDelegate协议

UIApplicationMain函数会根据principalClassName创建UIApplication对象,根据delegateClassName创建一个delegate对象,并将该delegate对象赋值给UIApplication对象中的delegate属性

接着会建立应用程序的Main Runloop(事件循环),进行事件的处理(首先会在程序完毕后调用delegate对象的application:didFinishLaunchingWithOptions:方法)

程序正常退出时UIApplicationMain函数才返回

按 Ctrl+C 复制代码

按 Ctrl+C 复制代码

系统入口的代码和参数说明:

argc:系统或者用户传入的参数

argv:系统或用户传入的实际参数

1.根据传入的第三个参数,创建UIApplication对象

2.根据传入的第四个产生创建UIApplication对象的代理

3.设置刚刚创建出来的代理对象为UIApplication的代理

4.开启一个事件循环(可以理解为里面是一个死循环)这个时间循环是一个队列(先进先出)先添加进去的先处理

ios程序启动原理

四、程序启动的完整过程

1.main函数

2.UIApplicationMain

* 创建UIApplication对象

* 创建UIApplication的delegate对象

3.delegate对象开始处理(监听)系统事件(没有storyboard)

* 程序启动完毕的时候, 就会调用代理的application:didFinishLaunchingWithOptions:方法

* 在application:didFinishLaunchingWithOptions:中创建UIWindow

* 创建和设置UIWindow的rootViewController

* 显示窗口

3.根据Info.plist获得最主要storyboard的文件名,加载最主要的storyboard(有storyboard)

* 创建UIWindow

* 创建和设置UIWindow的rootViewController

* 显示窗口

UIApplication的代理事件  Xcode解释

// 1. 应用程序启动完成,会调用此方法,启动之后,将不再调用此方法!
// 如果因为内存等原因,应用程序被操作系统干掉,再次点击图标,会调用此方法!
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSLog(@"应用程序启动");
   
    return YES;
}

// 2. 应用程序注销激活状态,游戏应该再此方法中暂停游戏进程!此方法在游戏开发中尤为重要!
- (void)applicationWillResignActive:(UIApplication *)application
{
    NSLog(@"%s", __func__);
   
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}

// 3. 应用程序退出到后台,释放共享资源,保存用户数据,停止时钟,保存足够的应用程序状态信息...
- (void)applicationDidEnterBackground:(UIApplication *)application
{
    NSLog(@"%s", __func__);
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}

// 4. 应用程序进入前台,如果在进入后台保存数据等操作,在此方法中,回复进入后台的操作
- (void)applicationWillEnterForeground:(UIApplication *)application
{
    NSLog(@"%s", __func__);
    // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
}

// 5. 应用程序变成活动状态,重新启动原来暂停的状态
- (void)applicationDidBecomeActive:(UIApplication *)application
{
    NSLog(@"%s", __func__);
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}

// 6. 应用程序将被终止
- (void)applicationWillTerminate:(UIApplication *)application
{
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}

@end

转载于:https://my.oschina.net/kaqijiang/blog/596407

iOS开发UI篇 程序启动原理和UIApplication相关推荐

  1. iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序

    iOS开发UI篇-使用嵌套模型完成的一个简单汽车图标展示程序 一.plist文件和项目结构图 说明:这是一个嵌套模型的示例 二.代码示例: YYcarsgroup.h文件代码: 1 //2 // YY ...

  2. iOS开发UI篇—UIWindow简单介绍

    iOS开发UI篇-UIWindow简单介绍 一.简单介绍 UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow iOS程序启动完毕后,创建的第一个视图控件就是UIWi ...

  3. IOS开发UI篇—导航控制器属性和基本使用

    IOS开发UI篇-导航控制器属性和基本使用 一.导航控制器的一些属性和基本使用 1.把子控制器添加到导航控制器中的四种方法 (1) 1.创建一个导航控制器 UINavigationController ...

  4. iOS开发UI篇—常见的项目文件介绍

    iOS开发UI篇-常见的项目文件介绍 一.项目文件结构示意图 二.文件介绍 1.products文件夹:主要用于mac电脑开发的可执行文件,ios开发用不到这个文件 2.frameworks文件夹主要 ...

  5. iOS开发UI篇—transframe属性(形变)

    iOS开发UI篇-transframe属性(形变) 1. transform属性 在OC中,通过transform属性可以修改对象的平移.缩放比例和旋转角度 常用的创建transform结构体方法分两 ...

  6. iOS开发UI篇—简单介绍静态单元格的使用

    iOS开发UI篇-简单介绍静态单元格的使用 一.实现效果与说明 说明:观察上面的展示效果,可以发现整个界面是由一个tableview来展示的,上面的数据都是固定的,且几乎不会改变. 要完成上面的效果, ...

  7. iOS开发UI篇—UITabBarController简单介绍

    iOS开发UI篇-UITabBarController简单介绍 一.简单介绍 UITabBarController和UINavigationController类似,UITabBarControlle ...

  8. iOS开发UI篇—UITableviewcell的性能优化和缓存机制

    iOS开发UI篇-UITableviewcell的性能问题 一.UITableviewcell的一些介绍 UITableView的每一行都是一个UITableViewCell,通过dataSource ...

  9. iOS开发UI篇—UITableview控件基本使用

    iOS开发UI篇-UITableview控件基本使用 一.一个简单的英雄展示程序 NJHero.h文件代码(字典转模型) 1 #import <Foundation/Foundation.h&g ...

最新文章

  1. linux 获取cpu id,linux获取cpu id和disk id
  2. Mysql 根据一个表数据更新另外一个表
  3. matlab dir datenum,matlab中的datenum
  4. [转载]Yacc基础
  5. 参数cluster_interconnect详细介绍
  6. linux i2c adapter 增加设备_LINUX设备驱动模型分析之四 设备模块相关(DEVICE)接口分析...
  7. bp神经网络隐含层神经元个数_CNN,残差网络,BP网络
  8. ABP入门系列(21)——切换MySQL数据库
  9. python - easy_install的安装和使用
  10. C语言程序设计:现代方法(第2版)第二章全部习题答案
  11. Vue中this.$router.replace和this.$router.push的区别
  12. Android友盟分享(微信简单集成)
  13. 减小pdf大小 打印 低分辨率
  14. oracle数据模型三要素,关系模型三要素
  15. Python每日一记129列表换行
  16. php larval 数据库when,Laravel DB类操作数据库
  17. 流行20年的架构设计原则SOLID可能已经不适合微服务了
  18. 夕阳无限好 只是近黄昏
  19. matlab 图片倒影_ai怎么做水倒影效果?ai制作图案倒影水汶效果教程
  20. 服务器连接数据库mysql

热门文章

  1. /usr/lib/deepin-wine/wine: error while loading shared libraries: libwine.so.1
  2. sklearn应用—高斯混合
  3. SDNU 1019.礼物(水题)
  4. js动态获取时间的方式
  5. 关于wordpress 点击文章查看内容跳转加载失败(404)的解决方法
  6. mybatis配置问题
  7. Jmeter报告优化之New XSL stylesheet
  8. java 求数组最大子序列之和
  9. POJ 1182 食物链,并查集的拓展
  10. 《剑指offer》第九题(用两个栈实现队列)