Xcode4.2之前的main函数如下:
int main(int argc, char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;
}
Xcode4.2工程中的主函数为
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([TCAppDelegate class]));
}
}
可以看出一个重要的变化是在4.2使用了ARC技术后,NSAutoreleasePool被废弃,改用@autoreleasepool,这里请不要该回原先的方式,如果改变后,在开启ARC选项后,程序将不能通过编译。
不论那个版本,UIApplicationMain函数都是程序的关键点,下面是对这个函数的分析:
UIApplicationMain()函数是初始化程序的核心,它接受4个参数。其中argc和argv两个参数来自于main()接受的两个参数;另外两个String型参数分别表示程序的主要类(principal class)和代理类(delegate class)。如果主要类(principal class)为nil,则默认为UIApplication;如果代理类(delegate class)为nil,则程序假设程序的代理来自Main nib文件。如果这两个参数任意一个不为nil,则UIApplicationMain()函数则会根据参数创建相应的功能类。因此,如果程序中使用自定义的UIApplication类的子类(不建议继承UIApplication类建立自定义的子类),你需要将你的自定义类名作为第3个参数传进来。
根据上面的分析,我们来看以下iOS程序的声明周期
对于UIApplicationMain函数中的第四个参数,我们也可以看出新旧版本的不同,我们建议在原先的工程中使用新的版本,以提高程序的速度,共修改如下几处
假如你的工程类都是以TC开头。
1.import你的appdelegate类,并修改第四个参数如下:
UIApplicationMain(argc, argv, nil, NSStringFromClass([TCAppDelegate class]));
2.删除MainWindow.xib文件
3.在工程的Info.plist文件中删除下面一行
4.在TCAppDelegate.m文件中,修改
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions函数,如下:
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.viewController = [[TCViewController alloc] initWithNibName:@"TCViewController" bundle:nil];
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
return YES;
其中加粗部分为新增部分。
经过上面的修改,我们就可以在程序load的过程中,省去加载MainWindow.xib文件,提高程序的速度。
相关推荐
在这个"iOS-RAC-高阶函数-带注释-Demo"中,我们将深入探讨RAC的高阶函数及其在实际项目中的应用。 首先,我们来看看什么是高阶函数。在Swift和很多函数式语言中,高阶函数是指可以接受一个或多个函数作为参数,或者...
定义三角形(Triangle)、矩形(Rectangle)和圆形(Circle)三个形状类。编写一个程序,能够根据用户输入生成相应的形状类对象。将形状的信息输出到显示器和文件中。具体说明如下:
在iOS和macOS开发中,处理信号异常捕获是一个重要的环节,这关乎到程序的稳定性和安全性。"signal exception catch"是指程序在运行过程中遇到特定的信号(如SIGSEGV、SIGABRT等)时,能够优雅地处理这些异常,而不是...
App的整个启动过程,性能优化 ... Main函数之前苹果还为我们的App做了哪些操作? OC项目中怎么使用Swift重写AppDelagate? UIApplication&UIApplicationMain;背后做了什么? 如何优化App启动过程?
1. 新建 Windows-base Application,打开 main.m 文件,在 main 函数中增加代码来获取用户默认信息和 iPhone 支持的所有语言设置。 2. 在 Resources 上右键,Add -> New File,文件类型选择 Resource->Strings File...
DispatchQueue.main.async { // 更新UI print("异步操作的结果:\(result)") } } ``` 在上述代码中,`completion` 参数是一个闭包,它接收一个 `result` 参数并没有返回值。当异步操作完成后,我们调用这个闭包...
1. **Main storyboard**:这是iOS应用的基础布局文件,用于定义应用的初始视图控制器和用户界面元素。在SplashDemo中,主storyboard可能包含了启动界面的视图控制器。 2. **SplashViewController**:这个类是专门...
在iOS开发中,多线程是一项基础且重要的技术,它能让我们实现应用程序的并行处理,提高用户体验。本文将深入探讨“iOS常驻线程”的概念、如何创建以及其与POSIX、NSThread和GCD的关系。 首先,我们来解释什么是...
标题 "基于 AList API 开发的 Android 和 iOS 客户端.zip" 提示我们这是一个包含 ...通过研究这个项目,开发者可以了解到如何组织 iOS 项目的代码结构,如何进行 API 调用,以及如何实现一个完整的 iOS 应用程序。
开发应用程序都要了解其生命周期。...main函数的两个参数,iOS中没有用到,包括这两个参数是为了与标准ANSI C保持一致。UIApplicationMain函数,前两个和main函数一样,重点是后两个,官方说明是这样
在iOS开发中,Block是一种强大的特性,它允许我们在代码中定义匿名函数,即不关联任何特定方法或函数的代码块。Block不仅可以作为局部变量、函数参数,还可以用于回调,这正是"IOS block回调代码实例Demo"所展示的...
9. **Interface Builder与Storyboard**:如果需要图形化设计用户界面,可以手动创建`Main.storyboard`文件,通过Interface Builder来布局UI元素。 10. **编译与运行**:完成项目设置后,可以直接在Xcode中选择...
本示例"ios demo,主队列,异步调度,手动创建线程,detachNewThreadSelector dispatch_get_main_queue"关注的是iOS中的四种主要线程管理方式:主队列、异步调度、detachNewThreadSelector以及dispatch_get_main_...
本篇文章将深入探讨iOS Block的基础概念、特点以及与指针函数的比较,同时讲解如何自定义Block。 一、Block基础 1. 定义:Block 是一个匿名函数,可以捕获并存储其所在上下文中的变量值,包括局部变量。Block 语法...
这个程序帮助新手理解如何在屏幕上显示文本,并且涉及到了基本的程序结构,包括主函数(main function)、视图控制器(view controller)以及事件处理。 在程序创建的过程中,会逐步深入理解iOS应用程序的代码结构...
在iOS中,我们可以利用`UIGraphicsGetImageFromCurrentImageContext`函数来获取当前屏幕的内容。这个函数是基于Core Graphics框架的,它允许我们创建一个图形上下文,然后获取其内容作为UIImage对象。以下是基本的...
例如,输入“list main”可以查看main函数附近的源代码。 2. break(简写为br): 设置断点,允许开发者在程序执行到特定位置时停止。使用时可以指定函数名、文件名加行号或内存地址。例如,“br set -n main”设置...
首先,`WKWebView`是iOS 8及更高版本中用于加载和显示网页内容的组件,它取代了旧的UIWebView。WKWebView提供了更高效、性能更好的网页渲染,同时也支持现代Web标准,如HTML5、CSS3和JavaScript。 1. **配置...
.add(to: .main, forMode: .common) } @objc func updateCounter() { let currentValue = Int(counterLabel.text!) ?? 0 counterLabel.text = "\(currentValue + 1)" } ``` **状态管理** 为了确保计数器的状态...