Objective-C入门
Objective-C是一种简单的计算机语言,设计为可以支持真正的面向对象编程。Objective-C通过提供类定义,方法以及属性的语法,还有其他可以提高类的动态扩展能力的结构等,扩展了标准的ANSI C语言。类的语法和设计主要是基于Smalltalk,最早的面向对象编程语言之一。
如果你以前使用过其他面向对象编程语言,那么下面的信息可以帮助你学习Objective-C的基本语法。许多传统的面向对象概念,例如封装,继承以及多态,在Objective-C中都有所体现。这里有一些重要的不同,但是这些不同在这文章会表现出来,而且如果你需要还有更多详细的信息存在。
如果你从来没有使用任何编程语言编过程序,那么你至少需要在开始之前,对相关概念进行一些基础的了解。对象的使用和对象对象架构是iPhone程序设计的基础,理解他们如何交互对创建你的程序非常重要。想了解面向对象概念的,请参看使用Objective-C进行面向对象编程。此外,参看Cocoa基础指南可以获得Cocoa中的面向对象设计模式的信息。
Objective-C: C的超集
Objective-C是ANSI版本C编程语言的超集,支持C的基本语法。在C代码中,你定义头文件和源代码文件,从代码实现细节分离公共声明。Objective-C头文件使用的文件名列在表1中。
表1 Objective-C代码的文件扩展名
扩展名内容类型.h头文件。头文件包含类,类型,函数和常数的声明。.m源代码文件。这是典型的源代码文件扩展名,可以包含Objective-C和C代码。.mm源代码文件。带有这种扩展名的源代码文件,除了可以包含Objective-C和C代码以外还可以包含C++代码。仅在你的Objective-C代码中确实需要使用C++类或者特性的时候才用这种扩展名。当你需要在源代码中包含头文件的时候,你可以使用标准的#include编译选项,但是Objective-C提供了更好的方法。#import选项和#include选项完全相同,只是它可以确保相同的文件只会被包含一次。Objective-C的例子和文档都倾向于使用#import,你的代码也应该是这样的。
字符串作为C语言的超集,Objective-C支持C语言字符串方面的约定。也就是说,单个字符被单引号包括,字符串被双引号包括。然而,大多数Objective-C通常不使用C语言风格的字符串。反之,大多数框架把字符串传递给NSString对象。NSString类提供了字符串的类包装,包含了所有你期望的优点,包括对保存任意长度字符串的内建内存管理机制,支持Unicode,printf风格的格式化工具,等等。因为这种字符串使用的非常频繁,Objective-C提供了一个助记符可以方便地从常量值创建NSString对象。要使用这个助记符,你需要做的全部事情,是在普通的双引号字符串前放置一个@符号,如下面的例子所示:
NSString* myString = @"My String ";类
NSString* anotherString = [NSString stringWithFormat:@"%d %s", 1, @"String"];
// 从一个C语言字符串创建Objective-C字符串
NSString* fromCString = [NSString stringWithCString:"A C string"encoding:NSASCIIStringEncoding];
如同所有其他的面向对象语言,类是Objective-C用来封装数据,以及操作数据的行为的基础结构。对象就是类的运行期间实例,它包含了类声明的实例变量自己的内存拷贝,以及类成员的指针。Objective-C的类规格说明包含了两个部分:接口和实现。接口部分包含了类声明和实例变量的定义,以及类相关的方法。实现部分包含了类方法的实际代码。图1展现了声明一个叫做MyClass的类的语法,这个类继承自NSObject基础类。类声明总是由@interface编译选项开始,由@end编译选项结束。类名之后的(用冒号分隔的)是父类的名字。类的实例(或者成员)变量声明在被大括号包含的代码块中。实例变量块后面就是类声明的方法的列表。每个实例变量和方法声明都以分号结尾。
图1 类声明
列表1展现了前面例子中MyClass类的实现。类同与类声明,类实现的位置也由两个编译选项确定,@implementation和@end。这些选项给编译器提供了要将方法和对应类联系起来,所需的范围信息。因此方法的定义和接口中对应的声明是匹配的,只是多了个代码块而已。
列表1 类实现
@implementation MyClass
- (id)initWithString:(NSString *) aName
{
if (self = [super init]) {
count count = 0;
data = nil;
name = [aName copy];
return self;
}
}
+ (MyClass *)createMyClassWithString: (NSString *) aName
{
return [[[self alloc] initWithString:aName] autorelease];
}
@end
注意: 虽然前面的类只声明了方法,但是类可以声明属性。
当用变量保存对象的时候,始终应该使用指针类型。Objective-C对变量包含的对象支持强弱两种类型。强类型指针的变量类型声明包含了类名。弱类型指针使用id作为对象的类型。弱类型指针常用于类的集合,在集合中对象精确的类型可以是未知的。如果你用过强类型语言,你也许觉得使用弱类型变量可能会带来问题,但是他们实际上给了Objective-C程序巨大的灵活性,而且使它更强大。
下面的例子里,展示了MyClass类的强类型和弱类型声明变量:
MyClass* myObject1; // Strong typing方法
id myObject2; // Weak typing
Objective-C中的类可以声明两种类型的方法:实例方法和类方法。实例方法就是一个方法,它在类的一个具体实例的范围内执行。也就是说,在你调用一个实例方法前,你必须首先创建类的一个实例。而类方法,比较起来,也就是说,不需要你创建一个实例。
方法声明包括方法类型标识符,返回值类型,一个或多个方法标识关键字,参数类型和名信息。图2展示insertObject:atIndex:实例方法的声明。声明由一个减号(-)开始,这表明这是一个实例方法。方法实际的名字(insertObject:atIndex:)是所有方法标识关键的级联,包含了冒号。冒号表明了参数的出现。如果方法没有参数,你可以省略第一个(也是唯一的)方法标识关键字后面的冒号。本例中,这个方法有两个参数。
图2 方法声明语法