学习有一个多月了,每天都有新的知识点,始终感觉自己是一个菜鸟。无所谓了,谁不是从菜鸟开始的,呵呵!写博客需要耐心,算是对自己学习过程的一些记录。
想到什么测试什么。
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文件中的信息。不过这也让我加深了印象。