info.plist文件
1.
Bundle name
: app名称,项目通常使用英文,app名称显示中文2.
Bundle identifier
: app标识符 上传AppStore和推送3.
Bundle versions string
, short app版本号
PCH文件
pch作用:
1.存放一些公用的宏
2.存放一些公用的头文件
3.自定义Log
// 程序在调试阶段的时候才需要打印
// ...表示宏里面的可变参数
// __VA_ARGS__表示函数里面的可变参数
#ifdef DEBUG // 表示当前调试阶段
#define CYXLog(...) NSLog(__VA_ARGS__)
#else // 发布阶段
#define CYXLog(...)
#endif
pch原理:就是把pch文件中的所有内容拷贝到所有文件的头部
-
注意点:
- pch文件一定要注意做些判断,判断下当前是否是OC文件,如果是就 导入OC的代码
所有的OC文件都会定义__OBJC__这个宏,苹果官方定义
- 和C混编:注意点:判断单下是否是OC文件
#ifdef __OBJC__
// 放OC
#endif
// 判断系统的版本号
#define iOS8 ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0)
#define iPhone5 ([UIScreen mainScreen].bounds.size.height == 568)
UIApplication
-
常识
-
UIApplication
对象是应用程序的象征 - 每一个应用都有自己的
UIApplication
对象,而且是单例 - 通过
[UIApplication sharedApplication]
可以获得这个单例对象 - 一个iOS程序启动后创建的第一个对象就是
UIApplication
对象
-
-
利用
UIApplication
对象,能进行一些应用级别的操作1.应用程序图片的提醒数字
2.联网状态
3.设置状态栏
4.打开资源,电话,网页,发短信
-
何为单例
1.整个应用程序只有一份内存.
2.重写
alloc
方法,只分配一次.3.提供
share
方法,获取单例对象.4.使用静态全局变量保存单例对象.
-
示例代码(模仿系统
UIApplication
写一个单例Person
)- 模仿系统单例
UIApplication
特征:- 1.程序一启动的时候,苹果就会帮你创建
UIApplication
, - 2.你如果调用
alloc
,系统马上抛异常
- 1.程序一启动的时候,苹果就会帮你创建
- 模仿系统单例
#import "Person.h"
// 1.程序一启动的时候就创建这个类的对象
// 2.不允许外界通过alloc分配内存,只要一调用,马上抛异常
@implementation Person
// 人的实例
static Person *_instance;
// 程序运行的时候就会加载类
+ (void)load
{
_instance = [[self alloc] init];
}
// exception 'NSInternalInconsistencyException', reason: 'There can only be one UIApplication instance.'
+ (instancetype)alloc
{
if (_instance) {
// 崩溃
// 创建异常对象
NSException *excption = [NSException exceptionWithName:@"NSInternalInconsistencyException" reason:@"There can only be one Person instance." userInfo:nil];
// 抛异常
[excption raise];
}
// super -> [NSObject alloc]
return [super alloc];
}
+ (instancetype)sharedPerson
{
return _instance;
}
@end
UIApplicationDelegate
-
常识
1.在app受到干扰时,会产生一些系统事件,这时UIApplication会通知它的
delegate
对象,让delegate
代理来处理这些系统事件-
2.
delegate
可处理的事件包括:2.1应用程序的生命周期事件(如程序启动和关闭)
2.2系统事件(如来电)
2.3内存警告
// 应用程序的生命周期
// 应用程序启动完成的时候调用
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
return YES;
}
// 当我们应用程序即将失去焦点的时候调用
- (void)applicationWillResignActive:(UIApplication *)application {
}
// 当我们应用程序完全进入后台的时候调用
- (void)applicationDidEnterBackground:(UIApplication *)application{
}
// 当我们应用程序即将进入前台的时候调用
- (void)applicationWillEnterForeground:(UIApplication *)application {
// 当我们应用程序完全获取焦点的时候调用
// 只有当一个应用程序完全获取到焦点,才能与用户交互.
- (void)applicationDidBecomeActive:(UIApplication *)application {
}
// 当我们应用程序即将关闭的时候调用
- (void)applicationWillTerminate:(UIApplication *)application {
}
@end
程序启动原理
-
一.首先找到程序入口,执行main函数
main -> UIApplicationMain
-
二.
UIApplicationMain
底层做的事情1.创建
UIApplication
对象2.创建
UIApplication
的代理对象,而且给UIApplication
对象代理属性赋值3.开启主运行循环,作用接收事件,让程序一直运行
4.加载
info.plist
,判断下有木有指定main.storyboard
,如果指定就会去加载
-
三.函数介绍:
NSStringFromClass
:根据一个类名生成一个类名字符串NSClassFromString
: 根据一个类名字符串生成一个类名
-
四.为什么使用
NSStringFromClass
-
NSStringFromClass
:输入类名有提示,避免输入错误
-
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
UIWindow
-
什么时候创建
- 1.加载
info.plist
,判断有没有指定main.storyboard
,指定了main.storyboard
,就会去加载main.storyboard
,执行main.storyboard
的时候创建.
- 1.加载
-
main.storyboard步骤
- 2.1创建窗口
- 2.2加载控制器
- 2.3设置窗口的根控制器,显示窗口
-
手动创建窗口
-
1.什么时候创建?
- 1.1 在加载info.plist文件之后,程序启动才完成,启动完成之后,就要显示窗口,因此在程序启动完成的时候创建窗口.
-
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 窗口显示的注意点:
// 1.一定要强引用
// 2.控件要想显示出来,必须要有尺寸
// 1.创建窗口
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
// 2.创建根控制器,在设置窗口的根控制器
UIViewController *vc = [[UIViewController alloc] init];
// 设置窗口的根控制器,底层会自动把根控制器的view添加到窗口上,并且让控制器的view有旋转功能
self.window.rootViewController = vc;
// 3.显示窗口
// makeKeyAndVisible:让窗口成为应用程序的主窗口,并且显示窗口
[self.window makeKeyAndVisible];
return YES;
}
-
窗口补充
1.应用程序中那些控件属于窗口,1.状态栏 2.键盘
2.窗口层级关系
UIWindowLevelAlert > UIWindowLevelStatusBar > UIWindowLevelNormal
设置窗口的层级,层级谁大就显示在最外面
-
3.UITextField显示键盘
- 注意点: 如果一个键盘想要弹出来,必须把textField添加到一个控件上.
-
addSubView
和rootViewController
的区别- 1> 直接用
addSubView
,控制器会被释放,控制器就不能处理事件 - 2>直接用
addSubView
,控制器的view不会自动旋转。 - 3> 用
rootViewController
,控制器不会被释放,而且控制器的view会自动旋转 - 4>旋转事件->
UIApplication
->Window
->rootViewController
->旋转控制器的view
- 1> 直接用