Objective-C 程序设计
变更履历
介绍
Objective-C 2.0 学习笔记将会是一个系列文章,主要用来记录笔者学习《Objective-C.2.0程序设计》的过程中一些心得,同时也做备忘和速查之用。从结构上来看,每一篇文章都将可能对应《Objective-C.2.0程序设计》的一个章节,当然也不排除多个篇章对应《Objective-C.2.0程序设计》一个章节的可能。
这一系列的文章随时可能更改,具体可以参见变更履历。
你需要具备的
本质上来说,学习《OC2》并不要求你具有其它语言的基础,但由于笔者本身具有多年的 Java 开发经验,所以,在一些概念上可能会引入 Java 的部分内容来解释,所以,你懂的(1年 Java 开发经验即可);同时,还需要你掌握设计模式等技能。
一台 PC 或 Mac 是必须的,但 PC 可能无法完成部分 Cocoa 程序的开发。
开发环境
Mac OS 需要你安装 Xcode 来作为开发工具;windows 下的开发可以参见《Windows 下的 Objective-C 开发环境配置简介》,具体配置这里就不累述了。
Objective-C 程序设计
“Objective-C 程序设计”是本系列的第一个篇章,主要介绍《OC2》。下面我们就切入正题,来看我们第一个 OC 程序。
// First program example
#import <Foundation/Foundation.h>
int main(int argc, const char *agrv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSLog(@"Programming is fun!");
[pool drain];
return 0;
}
常见的文件扩展名
扩展名 | 含义 | 扩展名 | 含义 |
---|---|---|---|
.c | C语言源文件 | .mm | Objective-C++源文件 |
.cc, .cpp | C++语言源文件 | .pl | Perl源文件 |
.h | 头文件 | .o | Object(已编译的)文件 |
.m | Objective-C源文件 |
第一个程序的解释
// First program example
这是一个注释,OC 支持两种注释方式,(//)可以注释一行;(/* */) 用来对一段内容进行注释,没什么可多说的。
#import <Foundation/Foundation.h>
#import 表示将该文件的信息导入或包含到程序中来使用。Foundation.h 是一个系统文件,导入它表示我们将使用 Foundation 框架,Foundation 框架提供了大约100多个可用的头文件。作为一种简便方式,导入 Foundation.h 将自动将这100多个头文件导入。Foundation 框架在《OC2》中第十四至第十九章中讲述,我们会在后面涉及到。
int main(int argc, const char *argv[])
与大多数编程语言一样,这里定义了一个程序的主函数,参见《TODO 预留的链接》中的描述。
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
这条语句作为自动释放池在内存中保留了空间。参见《TODO 预留的链接》中的描述。
NSLog(@"Programming is fun!");
这条语句我们分开来说,首先来看 @"Programming is fun!",@ 符号位于一对双引号的字符串前面,这称为常量 NSString 对象。Java 或 C 中的字符串没有前面的 @,有了这个符号就是 NSString 字符串对象。NSLog 的输入要求是一个 NSString 对象。
NSLog 是Foundation 框架提供的一个函数,它仅仅显示或记录其参数,输出格式一般如下:
2011-10-10 14:54:33.609 Fraction[6560] Programming is fun!
OC 的所有程序语句必须使用(;)结束。
[pool drain];
释放已分配的内存池。([])很有意思,我们把它留到《TODO 预留的链接》中来描述。
return 0;
终止 main 函数的执行,并返回状态值0。按照预定,0 意味着程序正常结束;任何非零值通常表示出现了一些问题。
NS 前缀
NS 是 Cocoa 框架对象类型的前缀,来源于史蒂夫.乔布斯被苹果开除那段时间建立的 NeXT。
NSString
这是一个大话题,足以开辟一个单独的篇章来描述它,所以,这里只是站位,后面会补充一篇单独描述 NSString 的文章,然后链接过去。
NSLog 的进阶使用
换行
NSLog(@"Testing...\n..1\n...2\n....3");
这里我们使用了转义符,没什么可说的。
显示变量
#import <Foundation/Foundation.h>
int main(int argc, const char *agrv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
int sum;
sum = 50 + 25;
NSLog(@"The sum 50 and 25 is %i", sum);
[pool drain];
return 0;
}
第一个参数中的百分号(%)是一个特殊字符,可以被 NSLog 函数识别,紧跟在百分号后的字符指定在这种情况下将要显示的值类型。只要 NSLog 函数在字符串中发现 %i 字符,它都将自动显示例程第二个参数的值。
另一个显示变量的程序
#import <Foundation/Foundation.h>
int main(int argc, const char *agrv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
int value1, value2, sum;
value1 = 50;
value2 = 25;
sum = value1 + value2;
NSLog(@"The sum %i and %i is %i", value1, value2, sum);
[pool drain];
return 0;
}
字符串格式说明(String Format Specifiers)
%i 用来表示整数类型,还有一些常用的格式输出字符,完整的描述参见 Apple 文档 《 String Format Specifiers》。
参考
2、《Objective-C 2.0 程序设计中文版》