第一个OC程序源码如下:
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool{ NSLog(@"Hello,World!"); } return 0; }
下面对这个输出"Hello,World!"的OC程序做下介绍:
#import是GCC编译器提供的,可以保证头文件只被包含一次。
#import <Foundation/Foundation.h>语句告诉编译器查看Foundation框架中的Foundation.h头文件。
框架是一种聚集在一个单元的部件集合,包含头文件,库,图像,声音文件等。
苹果公司将Cocoa,Carbon,QuickTime和OpenGL等技术作为框架集提供。Foundation框架是处理用户界面之下的层(layer)中的特性,例如数据结构和通信机制。
每个框架都是一个重要的技术集合,通常包含数十个甚至上百个头文件。每个框架都有一个主头文件,它包含了该框架中的其它各个头文件。通过使用 #import 导入主头文件,可以使用该框架中所有的部件。
Main函数的两个参数,argc表示参数(包括程序名)个数,argv是一个参数指针数组,并且每一个指针都指向一个字符串,表示一个参数。argv[0]就是程序名,argv[1]才是第一个参数。
NSString *str = [NSString stringWithUTF8String:argv[0]]; NSLog(@"%@",str);
输出如下:
NSLog(@"Hello,World!");
向控制台输出”Hello,World!”,类似与C语言中的printf()。NSLog()接受一个字符串作为其第一个参数,该字符串可包含格式说明符(如%d)。
@符号是OC在标准C语言基础上添加的特性之一,双引号中的字符串前有一个@符号,表示引用的字符串应该作为Cocoa的NSString元素来处理。
/n 表示换行
/t 表示Tab功能
%i 表示整数
%f 表示float
%@ 表示字符串
%d 表示double
%c 表示字符char
@autoreleasepool方便快捷管理内存的方案, 自动释放池是OC里面的一种内存回收机制,一般可以将一些临时变量添加到自动释放池中,统一回收释放,当自动释放池销毁时,池里面的所有对象都会调用一次release,也就是计数器会减1,但是自动释放池被销毁了,里面的对象并不一定会被销毁。
OC对象发送一条autorelease消息,就会把这个对象添加到最近的自动释放池中也就是栈顶释放池中, Autorelease实际上是把对release的调用延迟了,对于每一次autorelease,系统只是把对象放入了当前的autorelease pool中,当pool被释放时,pool中所有的对象都会被调用release。
自动释放池可以自动追踪需要延迟释放的对象。
将对象添加自动释放池维护的列表中:[object autorelease];。
当自动释放池本身销毁时,池子里的所有的对象对会release。
使用来自Foundation,UIkit,AppKit等框架中的类是,也需要先创建自动释放池,因为来自这些框架的类会创建并返回自动释放的对象。
创建自动释放池
//MRC NSAutoReleasePool *pool = [[NSAutoReleasePool alloc]init]; …//需要释放的对象 [pool realse] //ARC @autoreleasepool { …//需要释放的对象 }
使用自动释放池
自动释放池可以创建多个
多个自动释放池形成栈式结构
对象放入最近的栈顶的自动释放池
不要把所有的对象都放入自动释放池,只放需要延迟释放的对象
对于大量占有内存的对象,创建就近的自动释放池,保证它快速得到销毁
以上就是对一个简单的完整的OC程序的分析,如有错误,请批评指正。