Learn Objective-C: Day 3

欢迎继续阅读本文的第三部分-我希望你会喜欢!上周我们学习了类是如何被分割为不同的文件的(接口和实现),这周我们继续深入学习类。我们还会简短的介绍一下继承和变量的作用域。

到目前为止,我已经通过邮件、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,告诉操作系统应用正常结束。

继承

在第一种还记得我们定义NSString时调用了init方法吗?无论是NSMutableString, NSArray或是其他NS类,都需要调用init。看上去在每个类中定义init方法很麻烦是吗?这的确很麻烦,这就是为什么init方法只在NSObject实现中,NSObject是所有类的父类。因为类是相互继承的,一个类作为子类被建立,父类的方法自动可以被调用。
以NSMutableStringLetʼs举例。NSString是NSMutableString的父类。同时,NSObject是NSString的父类,所以NSMutableString继承自NSObject。

举例说,NSObject有一个init方法,所以它所有的子类都实现了这个方法-这是个类方法。实际上,init方法什么都没有做,只是返回了它本身。这么做的原因是这个方法可以被覆写。也就是说NSArray可以覆写init方法为它添加功能,比如判断内存空间或者准备实例变量。
综上所述,这是非常有用的。因为在继承的同时可以扩展类。当我们扩展一个类的时候,我们使用一个已经存在的类然后在已经存在的功能上添加新功能。这表示我们可以自己定义含有自定义方法的NSString,如在字符串里添加随机文本或者进行某些文本编码。

总结

现在,我们应该清楚类的原理了。为了测试你的理解程度,看看你是否能回答下面的问题:
  • 类和对象的区别是什么?
  • 我们为什么使用类?
  • 继承的意义是什么?
类在Objective-C中的地位非常重要。我们用了两周的时间来介绍类的理论。下周,我们将要开始实践,编写我们自己的类。


作业

前面介绍了很多概念,我们这周的作业是浏览Apple开发者网站(上周你应该已经做过了)并且看看上面的类。如果你不知道从哪儿开始,我建议可以从NSString。你会越来越熟悉父类,方法等。这对于你今后在使用他们时会非常方便。


下次

下周我们会编写一些关于类的代码。类在Objective-C中作用非常重要,你务必要掌握它,这也是我们这篇文章的意义!
如果你有任何问题或者观点,你可以留言或者给我发邮件。如果你想和我联系并且得到快速回复的话,请给我发tweet!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值