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

news/2024/7/20 22:24:18 标签: ios, xcode, objective-c

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: 
设备方向将要发生改变 



http://www.niftyadmin.cn/n/264983.html

相关文章

python海龟库教学

海龟库: 海龟绘图 “小海龟”turtle是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动&…

springboot项目启动、关闭脚本

目录 springboot项目启动、关闭脚本项目启动脚本:start.sh项目关闭脚本:stop.sh查看日志 springboot项目启动、关闭脚本 在jar包目录下新建下面脚本文件 项目启动脚本:start.sh #!/bin/sh RESOURCE_NAMEteam-system.jartpidps -ef|grep $R…

操作数据库命令行导入和导出

命令行导出数据库: 1,进入MySQL目录下的bin文件夹:cd MySQL中到bin文件夹的目录 如我输入的命令行:cd C:\Program Files\MySQL\MySQL Server 4.1\bin 2,导出数据库:mysqldump -u 用户名 -p 数据库名 > 导…

随手记录:Livox 时间戳修改为ROS时间戳

参考与前言 传感器类型:Livox-Mid70 参考链接:Ubuntu20.04系统安装Livox ROS Driver 官方驱动:https://github.com/Livox-SDK/livox_ros_driver 碎碎念:之所以要改成rostime主要是 提取pcd的时候发现这个timestamp 300.xxx 打…

数据库8之嵌套查询

上一篇文章讲到连接查询,连接查询就是一个一个去查找相匹配的行,再返回给用户看。当我们数据量少的时候我们用连接查询没有太大问题,可是,当数据量大的时候,连接查询效率显然不高。这个时候我们可以用嵌套查询&#xf…

网易三面:数据库查询树形结构层面如何找出一个节点的所有子孙节点和祖先节点?

文章目录 一、邻接表:依赖父节点查询一个节点的所有后代(求子树)怎么查呢?添加一条记录修改一个节点位置或一个子树的位置删除子树删除中间节点,并提升子节点二、路径枚举路径枚举的优点查询某个节点的全部祖先查询某个节点的全部后代路径枚举的缺点三、嵌套集嵌套集的优点嵌…

深入理解 Linux 内核

文章目录 前言一、内存寻址1、内存地址2、硬件中的分段(1)段选择符 3、Linux 中的分段(1)Linux GDT(2)Linux LDT 4、硬件中的分页5、Linux 中的分页(1)进程页表(2&#x…

每日一个小技巧:1招教你提取伴奏怎么做

伴奏是指在演唱或演奏时,用来衬托或补充主唱或乐器的音乐声音。而伴奏提取是一种技术,它可以帮助我们从歌曲中将人声和乐器分离出来。当我们听到一些喜欢的歌曲时,往往会被它的旋律深深吸引,想要将其作为自己的演唱曲目&#xff0…