第一个OC程序

第一个OC程序源码如下:

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    @autoreleasepool{
        
    NSLog(@"Hello,World!");
    }
    return 0;
}

下面对这个输出"Hello,World!"的OC程序做下介绍:

#import

#import是GCC编译器提供的,可以保证头文件只被包含一次。

#import <Foundation/Foundation.h>语句告诉编译器查看Foundation框架中的Foundation.h头文件。

框架

框架是一种聚集在一个单元的部件集合,包含头文件,库,图像,声音文件等。

苹果公司将Cocoa,Carbon,QuickTime和OpenGL等技术作为框架集提供。Foundation框架是处理用户界面之下的层(layer)中的特性,例如数据结构和通信机制。

每个框架都是一个重要的技术集合,通常包含数十个甚至上百个头文件。每个框架都有一个主头文件,它包含了该框架中的其它各个头文件。通过使用#import导入主头文件,可以使用该框架中所有的部件。

Main函数

Main函数的两个参数,argc表示参数(包括程序名)个数,argv是一个参数指针数组,并且每一个指针都指向一个字符串,表示一个参数。argv[0]就是程序名,argv[1]才是第一个参数。

NSString *str = [NSString stringWithUTF8String:argv[0]];
NSLog(@"%@",str);

输出如下:

NSLog函数

NSLog(@"Hello,World!");

向控制台输出”Hello,World!”,类似与C语言中的printf()。NSLog()接受一个字符串作为其第一个参数,该字符串可包含格式说明符(如%d)。

@符号是OC在标准C语言基础上添加的特性之一,双引号中的字符串前有一个@符号,表示引用的字符串应该作为Cocoa的NSString元素来处理。

表示换行

表示Tab功能

%i 表示整数

%f 表示float

%@ 表示字符串

%d 表示double

%c 表示字符char

@autoreleasepool 自动释放池

@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程序的分析,如有错误,请批评指正。

原文地址:https://www.cnblogs.com/tgycoder/p/4851022.html