一些摸索

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

想到什么测试什么。

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文件中的信息。不过这也让我加深了印象。


终于明白,“喜欢”是一种莫大的能量!
原文地址:https://www.cnblogs.com/tml839720759/p/3219134.html