Learn Objective‐C
原文地址 http://cocoadevcentral.com/d/learn_objectivec/
译者前言
在网上看到这篇文章觉得写的很不错,但是貌似没有人翻译成中文,我就大胆翻译了。本人做软件开发6年了,但是大多数是在Windows平台上,最近才在我的机器上装了一个leopard,在Objective-C上也是一个新手,对于本文翻译的是否到位心里还在打鼓。如果有觉得翻译不对不好的地方,请与我联系,我的油箱是:cchenhao at gmail dot com。
cc很好J,谢谢大家。
Objective-C
Objective‐C是开发Mac软件的主要编程语言。如果你了解一些面向对象的基本概念和C语言,那么会对你学习Objective‐C有很多帮助,如果你不了解C,那么建议你先读一下C 指南。
这篇指南由Scott Stevenson编写并做图。
方法调用
为了尽快开始,让我们先看一些例子。
调用一个对象的方法的基本语法是这样的:
[object method];
[object methodWithInput:input];
方法可以有返回值:
output = [object methodWithOutput];
output = [object methodWithInputAndOutput:input];
你还可以调用类的方法,这也是创建一个对象的办法。在下面的例子里,我们调用了NSSting类的string方法,用来返回一个新的NSString类的对象。
id myObject = [NSString string];
id类型意味着变量myObject可以是任意类型的对象。所以,当你编译这段代码时,它的实际类型以及它所实现的方法编译器是不知道的。在我们的例子里,很显然对象的类型是NSString,所以我们可以改变对象的类型声明:
NSString* myString = [NSString string];
现在,这就是一个NSString类型的变量了,如果我们在这个对象上调用NSString类型对象不支持的方法,编译器就会发出警告。
注意:在对象类型的右面有一个星号(*),在Objective-C中,所有的对象变量都是指针类型。id类型已经被预定义为指针类型,所以不需要加一个星号。
嵌套调用
在许多编程语言中,嵌套的方法或函数调用像是这样的:
function1(function2());
function2的返回值做为输入参数传递给function1。在Objective-C中,嵌套调用看上去像是这样的:
[NSString stringWithFormat:[prefs format]];
要尽量避免在一行语句中进行两层以上的嵌套,这样会使代码的可读性降低。
多输入参数的方法
一些方法需要多个输入参数。在Objective-C中,一个方法的名字可以被拆分成几段,在头文件中,多输入参数的方法声明看上去像是这样的:
-(BOOL)writeToFile:(NSString *)path
atomically:(BOOL)useAuxiliaryFile;
你可以这样调用这个方法:
BOOL result = [myData writeToFile:@”/tmp/log.txt” atomically:NO];
这些不是命名参数。在运行时环境中,该方法的名字实际上是 writeToFile:atomically:
访问器
在Objective‐C中,所有的实例变量默认都是私有的,所以,在大多数情况下,你应该使用访问器来获取或设置这些变量的值。现在有两种语法。下面的是传统的1.x语法:
[photo setCation:@”Day at the Beach”];
output = [photo caption];
第2行代码不是直接读取实例变量。实际上它是在调用名为caption的方法。在Objective-C中,大多数情况你不用在获取器(getter)前面添加一个”get”前缀。在任何情况下,在方括号中代码都意味着你是在给一个对象或者一个类型发送一个消息(即一个方法调用)。
点操作符
在Mac OS X 10.5中,Objective-C 2.0新增了点操作符的设置器(setter)和获取器(getter):
photo.caption = @”Day at the Beach”;
output = photo.caption;
两种语法你可以使用任何一种,但是在一个项目中最好只使用一种。同时,点语法只能使用在设置器(setter)和获取器(getter)上,而不能用于普通方法。
创建对象
创建对象有两种主要的办法。第一个是之前你看到的:
NSString* myString = [NSString string];
这是一种更加方便自然的方式。通过这种方法,你创建了一个自动释放(autoreleased)的对象,这一点我们会在后面看到更多的细节。尽管如此,在许多地方,你可能需要通过手工创建的方式来创建一个对象,如下:
NSString* myString = [[NSString alloc] init];
这是一个嵌套的方法调用。第一个是NSString类本身的alloc方法调用。这是一个相对低层的调用,它的作用是分配内存及实例化一个对象。第二个是调用新创建对象的init方法。init方法通常做对象的初始化设置工作,比如创建实例变量。作为一个类的使用者,你无法知道这些方法的实现细节。在某些情况下,你可以使用init方法的另外一种版本,这些版本带有输入参数:
NSNumber* value = [[NSNumber alloc] initWithFloat:1.0];