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

作者: Developer_Yancy | 来源:发表于2016-04-07 22:47 被阅读684次

    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

    相关文章

      网友评论

      • csqingyang:你好,问下LBS类型的应用 需要根据定位地点加载数据,定位一般是在哪里?给appdelegate写个分类?
        Developer_Yancy:@csqingyang 从产品角度看的话,你这个做法是合理的,因为用户也不一定允许你的应用进行定位操作,我觉得再提供一个可选地区的会更好一些。如果你一定要在首次加载的时候就定位,可以在AppDelegate的didFinishLaunchingWithOptions:里面先定位
        csqingyang:是的,想这样做。当定位成功时,我使用通知发送消息给首页控制器 但是程序第一次加载时,任然是使用默认定位的数据 然后下一次刷新时 才有数据
        我在viewDidLoad中 先 创建自己的定位对象去定位,(定位成功后,广播给首页控制器) 然后加载网络请求。
        Developer_Yancy:@csqingyang 不是很懂你意思,你意思是程序一启动马上定位位置信息?

      本文标题:iOS笔记-一些零散的知识点

      本文链接:https://www.haomeiwen.com/subject/dicvlttx.html