• 一些摸索


    学习有一个多月了,每天都有新的知识点,始终感觉自己是一个菜鸟。无所谓了,谁不是从菜鸟开始的,呵呵!写博客需要耐心,算是对自己学习过程的一些记录。

    想到什么测试什么。

    Q1:工程文件的目录结构和本地存储的结构差异。

    A1:发现本地的存储和工程文件中的目录结构不是一样的,所以我觉得工程中的文件夹是叫做所谓的group,只是利于工程文件中文件的管理。


    Q2:对工程运行的流程还是不太清楚。

    A2:

    工程文件中有个main.m的文件,和C程序一样,这是整个工程的入口。

    //main.m
    #import <UIKit/UIKit.h>
    
    #import "YXAppDelegate.h"
    
    int main(int argc, char *argv[])
    {
        @autoreleasepool {
            return UIApplicationMain(argc, argv, nil, NSStringFromClass([YXAppDelegate class]));
        }
    }

    有一个@autoreleasepool{}的代码块,作用是为了代码块中对象的延迟自动释放,但是和NSAutoreleasePool有什么区别?查阅了一下官方文档,大致是说用到ARC的时候就不能直接用NSAutoreleasePool,而应该用@autoreleasepool{}代码块,在不使用ARC的情况下,两者都可以用,而且@autoreleasepool{}会更高效。但是ARC技术我大致了解,但是没用过。

    Important: If you use Automatic Reference Counting (ARC), you cannot use autorelease pools directly. Instead, you use @autoreleasepool blocks. For example, in place of:
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    // Code benefitting from a local autorelease pool.
    [pool release];
    you would write:
    @autoreleasepool {
        // Code benefitting from a local autorelease pool.
    }
    @autoreleasepool blocks are more efficient than using an instance of NSAutoreleasePool directly; you can also use them even if you do not use ARC.

      //autorelease之后引用计数并不会马上减1
    YXMyViewController *myViewController = [[[YXMyViewController alloc] init] autorelease];
    NSLog(
    @"%d", [myViewController retainCount]); //retainCount == 1

     再看下结果

    int main(int argc, char *argv[])
    {
        @autoreleasepool {
            return UIApplicationMain(argc, argv, nil, NSStringFromClass([YXAppDelegate class]));
        }
    }

    前面两个参数就不说了,第三个参数是UIApplication or 子类, nil 默认是UIApplication, 最后一个参数指定UIApplication的代理类,接下的工作就是通过代理类来完成。


    Q3:先去复习一下控制器的大致生命周期

    A3:大致复习了一下,值得注意的是视图的加载过程,在控制器初始化的时候如果没有使用nib文件初始化视图,那么就会在控制器第一次用到view的时候调用loadView去加载视图,这中机制可以高效利用内存:

        YXMyViewController *myViewController = [[[YXMyViewController alloc] init] autorelease];
        NSLog(@"%d", [myViewController retainCount]);   //retainCount == 1
        NSLog(@"%@", myViewController.view);  // 当用到view  才会去调用loadView加载视图。

    当内存不够时,会发出警告并调用 viewWillUnload  和  viewDidUnload 来销毁视图,释放内存。


    Q4:nib文件和xib文件只是名字不同吗?

    A4:单地说,就是xib和nib都是一些对象的描述,而前者是xml格式,后者是一种二进制格式。但是xib文件可以方便的更改,不过在build的时候,xcode会把xib转换成nib文件。

    当控制器使用xib文件初始化时,会根据xib文件的内容一步步创建所有的视图对象。


    Q5:xib文件与特定的控制器一一对应吗?

    A5:不是的,xib文件只是存储着视图的创建信息,不同的控制器可以用同一个xib文件去初始化,当然这些控制器要满足一定的条件。


    Q6:控制器通过xib文件初始化的时候发生了什么?

    A6:控制器初始化完成后并不会马上根据xib文件的信息加载视图,我想这时候只是读取了xib文件的信息到内存中。当真正需要用到视图的时候,控制器会调用loadView方法根据xib文件的信息加载视图。我试图去重写loadView加载xib,但是不知道怎么取到xib文件中的信息。不过这也让我加深了印象。


    终于明白,“喜欢”是一种莫大的能量!
  • 相关阅读:
    第二次冲刺 03
    第二次冲刺 02
    第二次冲刺 01
    程序员修炼三部曲阅读笔记03
    程序员修炼三部曲阅读笔记02
    团队项目计划会议
    课堂练习—购书
    构建之法阅读笔记03
    学习进度条十二
    课堂作业找水王2
  • 原文地址:https://www.cnblogs.com/tml839720759/p/3219134.html
Copyright © 2020-2023  润新知