iOS笔记-一些零散的知识点

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,系统马上抛异常
#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的时候创建.
  • 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添加到一个控件上.
  • addSubViewrootViewController的区别
    • 1> 直接用addSubView,控制器会被释放,控制器就不能处理事件
    • 2>直接用addSubView,控制器的view不会自动旋转。
    • 3> 用rootViewController,控制器不会被释放,而且控制器的view会自动旋转
    • 4>旋转事件->UIApplication ->Window->rootViewController ->旋转控制器的view

你可能感兴趣的:(iOS笔记-一些零散的知识点)