main.m文件解析--@autoreleasepool和UIApplicationMain

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

iOS 程序入口UIApplicationMain详解相信大家新建一个工程的时候都会看到一个main.m文件只不过我们很少了解它现在我们分析一下它的作用是什么

一、main.m文件

int main(int argc, char * argv[]) {
	@autoreleasepool {
    	return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
	}
}

1、@autoreleasepool
@autoreleasepool将整个应用都是包含在一个自动释放池 block 中。在mian之前可能会产生一些对象需要再程序结束的时候释放在mian之前RunLoop还没有开启这些对象不会随着runloop休眠释放。所以需要使用@autoreleasepool将之前对象放到自动释放池。

autorelease对象在什么时机会被调用release
-如果对象直接被autoreleasepool包住那在autoreleasepool大括号结束的时候就release
-如果对象不是被autoreleaspool包住释放是由runloop控制的,在当前的runloop迭代结束时释放的(对象能够释放的原因是系统在每个runloop迭代中都加入了自动释放池Push和Pop)

2、UIApplicationMain

int UIApplicationMain(int argc, char * _Nullable *argv, NSString *principalClassName, NSString *delegateClassName);

参数介绍

  • argc来自于main()接受的参数
  • argv来自于main()接受的参数
  • 第三个参数是UIApplication或其子类如果该参数为nil使用默认的UIApplication,如果要针对UIApplication来完成一些事情的话 那么可以自定义一个UIApplication的子类 例如有一些逻辑需要在每一个页面中执行那么就可以考虑自定义一个 UIApplication的子类在子类中处理而不是将这些事情分散到各个页面对应的VC处理
  • 第四个参数代理类(delegate class)指定了 AppDelegate 类作为应用的委托它被用来接收类似 didFinishLaunching 或者 didEnterBackground 这样的与应用生命周期相关的委托方法

功能
UIApplicationMain() 函数的三大功能:
1.根据principalClassName创建UIApplication对象。
2.根据delegateClassName创建delegate对象并将该delegate对象赋值给UIApplication对象中的delegate属性,用于监听应用程序是如何运行的.。
3.建立应用的Main runloop进行事件的舰艇和处理。
4.程序正常退出时UIApplicationMain函数才返回。

二、扩展UIApplication对象

UIApplication对象和其delegate

  • UIApplication对象代表着我们的应用主要负责以下内容
    1负责处理用户事件并分发事件到应该处理该消息的目标对象。 比如手势事件处理
UIApplicationsharedApplication].applicationSupportsShakeToEdit =YES;

2管理以及控制视图包括呈现、控制行为、当前显示视图等。比如设置app的icon上面通知提示数字

 [UIApplicationsharedApplication].applicationIconBadgeNumber = 4;
  • 其delegate负责内容
    当一些生命周期内重要事件比如内存警告、进入前后台等发生时应用程序通知该对象。
-(void)applicationDidFinishLaunching:(UIApplication *)application 
应用程序启动完毕。 

-(BOOL)application:(UIApplication )application didFinishLaunchingWithOptions:(NSDictionary )launchOptions 
当由于其它方法打开应用程序如URL指定或者连接通知委托启动完毕

-(void)applicationWillTerminate:(UIApplication *)application 
通知委托应用程序将在关闭 退出请做一些清理工作。

-(void)applicationWillResignActive:(UIApplication *)application 
通知委托应用程序将进入非活动状态在此期间应用程序不接收消息或事件。

-(void)applicationDidBecomeActive:(UIApplication *)application 
通知委托应用程序进入活动状态请恢复数据

-(void)applicationDidReceiveMemoryWarning:(UIApplication *)application 
通知委托应用程序收到了为来自系统的内存不足警告。

-(void)applicationSignificantTimeChange:(UIApplication *)application 
通知委托系统时间发生改变主要是指时间属性而不是具体的时间值 

-(BOOL)application:(UIApplication )application handleOpenURL:(NSURL )url 
打开指定的URL 

– application:willChangeStatusBarOrientation:duration: 
控制状态栏方位变化 

– application:didChangeStatusBarOrientation: 
设备方向将要发生改变 


阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6