欢迎继续阅读本文的第三部分-我希望你会喜欢!上周我们学习了类是如何被分割为不同的文件的(接口和实现),这周我们继续深入学习类。我们还会简短的介绍一下继承和变量的作用域。
到目前为止,我已经通过邮件、twitter和评论收到了不少反馈。非常高兴你能对这个话题如此感兴趣并且作出了如此多的努力。保持下去!
复习一下:类和对象
让我们复习一下之前学习的内容。如果你不是很了解,请返回上一部分。好的,让我们说说什么是类呢?
类是一个数据封装和订制方法的集合。一个类也许包含不同类型的数据,通常(但不是一定)类的方法会和类的数据有一定关联。在Objective-C中,一个类一般包含两个文件:一个接口文件和一个实现文件。接口文件使用.h为后缀,在这里可以迅速的找到类中的方法和数据。实现文件使用.m为后缀名,它是代码主要存放的地方,所以它包含接口中定义的方法的真正的实现。
那么类和对象的区别是什么?什么是对象?一个对象是类的一个实例。回忆一下我们关于汽车的例子。汽车是一个类,myCar、dansCar和yourCar都是对象,因为它们都是汽车类的实例。
Apple提供的类(和一些历史)
在我们开始讲述之前,我想分享一下你会经常使用的,Apple中提供的类,首先我会介绍一下历史。
很多Apple提供的类都会有“NS”的前缀,它代表着“NextyStep”。当乔布斯离开Apple之后,他创立了NeXT,并且创造了运行在自己操作系统上的服务器。这个服务器上使用的面向对象语言就是NeXTSTEP。这就是“NS”的来源。当Apple需要(这里也有一个历史原因)NeXTSTEP时,他决定让Mac OS X基于NeXTSTEP。
这里有一些我们会经常使用的类:
- NSString代表一个不可变字符串。
- NSMutableString代表一个可变字符串。
- NSArray代表一个不可变的对象数组。
- NSMutableArray代表一个可变的对象数组。
- NSNumber代表一个数值。
后面我们还会介绍更多,目前上面的这些已经可以满足我们的基本条件了。也许你在考虑可变和不可变的意义,这是一个非常值得考虑的问题。如果一个对象是不可变的表示这个对象指定的值是一个静态的。这个值不能被改变。如果一个对象是可变的,代表它可以在创建后被改变。
指针和初始化
让我们定义一个静态字符串并且打印它,代码如下:
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
NSString *testString;
testString = [[NSString alloc] init];
testString = @"Here's a test string in testString!";
NSLog(@"testString: %@", testString);
return 0;
}
我们在XCode中进入File > New Project > Mac OS X > Application > Command Line Tool > 输入: Foundation
(
好长的过程!) 然后编辑实现(以.m结尾)。
我们能做的事情很少,让我们一步一步的看。
首先,我们引入了foundation包(这是因为我们在新建工程的时候输入了Foundation)。
int main (int argc, const char * argv[]) {
这里声明了一个当程序执行时调用的初始化函数。两个以逗号分割的参数是传给我们应用的参数。现在,不要担心这些,因为暂时不需要它。
NSString *testString; testString = [[NSString alloc] init];
我们现在定义一个指针指向NSString,叫做testString。这时还没有字符串,只有一个指向没有创建的字符串的指针。下一行,我们创建了这个字符串。
你也可以写成这样:
testString = [NSString alloc];
[testString init];
这可能看起来有点迷惑。在第一种写法里,我们将语句嵌套在括号中,写在同一行中,第二种写法里我们将语句分开,写成了两行。init方法用于初始化所有类中变量的实例。
testString = @"Here's a test string in testString!";
从这行代码可以简单的看出意义,我们在引号前加一@代表告诉编译器后面的部分是一个NSString。
NSLog(@"testString: %@", testString);
这里我们在控制台上打出了一些消息。XCode在Run菜单下有一个debugger。当开发时打印发生的事件和变量是非常有帮助的-这在你解决问题时非常有用。这个方法和printf类似(还记得第一周介绍的吗?)可以在字符串中使用替换符(%@表示一个Objective-C对象)。
最后我们返回0,告诉操作系统应用正常结束。
继承
以NSMutableStringLetʼs举例。NSString是NSMutableString的父类。同时,NSObject是NSString的父类,所以NSMutableString继承自NSObject。
举例说,NSObject有一个init方法,所以它所有的子类都实现了这个方法-这是个类方法。实际上,init方法什么都没有做,只是返回了它本身。这么做的原因是这个方法可以被覆写。也就是说NSArray可以覆写init方法为它添加功能,比如判断内存空间或者准备实例变量。
综上所述,这是非常有用的。因为在继承的同时可以扩展类。当我们扩展一个类的时候,我们使用一个已经存在的类然后在已经存在的功能上添加新功能。这表示我们可以自己定义含有自定义方法的NSString,如在字符串里添加随机文本或者进行某些文本编码。
总结
- 类和对象的区别是什么?
- 我们为什么使用类?
- 继承的意义是什么?
作业
下次
如果你有任何问题或者观点,你可以留言或者给我发邮件。如果你想和我联系并且得到快速回复的话,请给我发tweet!