(翻译)初学者的object-C指南

初学者的object-C指南

 英文原文:http://blog.teamtreehouse.com/the-beginners-guide-to-objective-c-language-and-variables

 

也许我对object-c编程语言的经验你听起来会很熟悉。我成长的世界里充满了各种点号,分号,大括号,在编程的世界里,类似javascript,java,C#以及其他很多语言都在使用这些符号。我想“Object-C 不可能有这么难吧”,接着我看了看我第一个Object-C代码之后想,“卧槽!(What is this hot mess?)为什么这么多方括号?”

好吧,让我们稍微退一步,剧透一下:其实Object-C没那么难(我现在都喜欢上它了),它主要用来给iPhone和iPad写App程序,非常灵活,强大,并且在很多方面跟其他主流编程语言有很多相似之处。

 

Source: TIOBE Programming Community Index for
August 2013 – http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html

 

鉴于我开始有一些恐惧,我阅读了一些文档,浏览了写代码,自己试了试,请教行家问了一些菜鸟问题,然后它让我觉得,就像一个有时候很容易忘记的观点:“语言真的不重要”,在编程的时候,我们使用的语言只是一些关于我们想怎么控制电脑的细节的语法,实际我们用到的概念:循环,条件,使用变量,等等,都是大同小异,当我们学习一种不同的语言我们只需要学习这种语言特有的字符来控制机器。

抛开别的不谈,作为第一个学习的编程语言,Object-C也很不错。下面你会找到一个开始使用Object-C语言的IOS开发指南,这将作为如何使用Object-C编程的学习辅助材料,或者,如果你已经了解其他的编程语言,这将是快速参考。

 

Object-C 编程语言

你也许从名字猜到,“Object-C”是基于C编程语言,添加了很多面向对象的功能。它早在1980年被开发,但是随着IOS的崛起才真正的得到普及。让我们先来解决一些关于Object –C的一些常见问题和让人恐惧的地方(fears)。

 

C?C++?C#?怎么了(WHAT GIVES)?

Object-C不是唯一的从C衍生出来的流行语言。首先流行的是C++,它原本命名为“带类的C”,当时的想法是让C带有类和其他面向对象的功能。得益于C本身的给力,结合面向对象方法之后,C++变得流行起来,

 C#是微软创建的,想让C++在面向对象的路上走的更深入,一开始他挺像那个大规模流行的叫做Java的语言,不过尽管他们拥有差不多的核心语法,功能还是有各异。

 这些从C衍生出来的语言,有个很好的地方,就是他们的基本语法都一样的。变量通常以同样的方式去声明,以及很多重要的关键字也重复。

所有这些“面向对象”都是怎么回事?

借用我的另一篇文章 “Java for Android”:

面向对象语言围绕着对象的概念,在物理世界中,看看房间周围然后想象每个东西都是一个对象。例如,在我桌子上,现在我有一个杯子,作为一个对象,它的名字是杯子并且它拥有属性,它的颜色,以及能装多少液体。面向对象语言允许我们定义像杯子那样的对象并且在代码中获得他们的属性。我们也可以给对象发送信息。对于我的杯子也许我想知道它是不是空的,我们可以在app里头创建并且控制各种对象去做不同的事情。例如,我们可以用camera对象来拍一张照片,Camera对象象征着Iphone里头的物理摄像头,但是我们可以通过代码的方式来交互。

 

The isEmpty message for this mug object will return NO!

 

但是这些中括号是怎么回事?这代码看起来像垃圾。

Object-C 维护着所有C语言的属性和语法,增加进去的面向对象属性,就像smalltalk模型里头的,当我们发送一个信息给对象(之后会更多关于这方面的),会以这种方式:

mug makeEmpty

(这个 makeEmpty 信息被发送到 mug 对象)在Object-c 我们简单的用中括号括住这发送动作:

[mug makeEmpty]

看到的这些,第一印象就像任意的一组括号集,但是随着时间的推移和自己的实践,围绕着这些面向对象概念,作为C语言的代码世界上增加的一个薄层,这样的一个组织代码机制有其意义所在。

C + stuff you can do with square brackets = Objective-C!

 

好吧,但是我不想管理我的内存

你不必管理,算是吧。在IOS4.0,苹果推出了ARC的概念。

自动引用计数器(Automatic Reference Counting) 让object-c编程远离内存管理的痛苦,在较老的IOS代码里你会看到很多retain和release的信息传到对象,但是在使用ARC的工程里,这些信息将会由编译器处理。代码最终看起来更有点像会自动管理内存,就像JAVA那样。

 但是在IOS编程中,如果想流畅的操作和高效的避免app的崩溃,很重要的一点,你得明白内存是如何分配,使用和释放。更多的关于Object-c内存管理,请查看IOS基础章节,iOS Foundations stage about ARC.

 

Object-c 编程语言部件

让我们谈谈代码本身。在这个最基本的层面,编程真的只是关于数据的处理。有各种各样的数据类型我们需要用到,从简单的数字 和 yes/no值,到更复杂点的,图片或者游戏里头玩家信息。

 

基本数据类型

一些我们在Object-c里头更常用的数据类型包括:

Int- 整型。例如,包含0和负值在内的所有整数(不包含小数点)。

Float- 浮点数,包含很多小数点。因为小数部分会变化,或者浮动,这些值可能是不固定的,这点很重要。如果需要精确的小数,比如货币这种,我们应该使用NSDecimalNumber数据类型。

Bool-“boolean”的缩写,这是占1-bit的并且只能是“true”或者“false”值,C语言(也就是说,Object-C)认为0是“false”,1是“true”。因此,以下关键字可以用来代表 true/false值:YES/NO,TRUE/FALSE,true/false,1,0.

Char-简单的字符,比如字母A或者符号“#”,注意小写和大写字符并不一样,所以“a”和“A”是两个不同的字符。

NSString-字符串数据,一系列的字符串一起从而形成文字,比如聚会上拉起的横幅。

NSNumber-这个类是个轻量级的“封装”类,对上面提到的原始数据类型提供面向对象的属性。

以上最开始的4种数据类型,int,float,bool和char,是标量(非对象)数据类型,也就是说他们是相当简单和直接。“原始”同样被用来描述这种数据类型,因为它没有对象数据类型那么高级。其他标量数据类型包括short,double和long。更多关于Object-c基本数据类型的信息,请查看Objective-C 2.0 Data Types.

NSstring和NSNumber以大写字母开始是因为他们是复杂得多的数据类型,他们实际上是对象,Object-c的命名规则是对象名字应该以大写字母开头。一个对象和原始数据类型不一样,因为它拥有更复杂的属性和可用的方法,而简单数据类型直接和作用有限。例如,我们可以发送一个信息“length”到NSString对象,然后NSString会告诉我们文本里头有多少个字符,int数据类型可不会返回那样的信息。

你可能好奇为什么NSString 和NSNumber 以“NS”开头而不是 string和number。对象都被定义在类文件里(更多内容在第二节),并且所有的Object-c使用的类会加载到同一个地方,这意味着同名的类会产生问题。为了避免同名问题,Object-c采用了一种公约,通过增加2到3个字符前缀到类名来表明他们来自哪。“NS”来自于“NeXT”和“NeXTSTEP”电脑,这公司是在80年代,史蒂夫·乔布斯被迫离开苹果后创立的。

 

变量

编程时,一个变量基本是数据的容器,数据可以是任何东西,简单的,比如歌词中的一个简单数字,或者是歌曲的元数据。当我们在Object-C产生一个元数据,我们通常指定它要包含什么数据,这就是所谓的静态输入数据。电脑里的一块内存被分配出来作为容器来装载这些数据,我们用给定的名字来保存对容器的引用

静态输入,意味着各个变量(或者说容器)的数据类型在保存前得先声明。比如,如果一个变量预估是要来保存数字的,我们就应该这么声明int,并且我们不会允许放其他类似字符进去。在程序被运行前,变量这种静态类型就会被检查。如果我们忘记声明一种数据类型或者声明错了,就会出现一个错误。

好吧,让我们最后看看代码!这里有个例子,声明一个标量变量然后赋予一些数据:

 

上面的代码行,声明了一个叫做“favoriteNumber”的变量,保存int(整数)数据。然后我们赋予这个变量一个值24.本质上吗,它把值24放进一个叫做favoriteNumber的容器。之后的代码我们可以用名字来获得我们放进去的数据。

  1. 变量声明的第一个字是数据类型,告诉我们这将会保存什么样的数据。
  2. 第二个字是变量的名字,可以起任何名字,不过得遵守一些约定,变量名字必须不包含任何空格或者特殊字符,他们只能是字符,数字和下划线。他们也不能以数字开头。
  3. 等号(=)是操作符,意味着为我们执行一个特定的操作。这是赋值运算符,意味着我们使用它来为变量赋予值。在这例子里,它把右边(#4)的整数值赋予了左边(#2)的变量favoriteNumber。
  4. 绿色的数字是我们要处理的整型值。整型数字是正或负的,不包含小数部分,就像例子里头的。
  5. 最后,这行最后的字符是分号,用来结束这行语句。Object-C里头的分号就像句子的分段,我们用它来确定我们已经说完一些事情。Object-C里头的每一条语句必须以分号结尾(注意为了更好的阅读体验,一个语句可能分成好几行)。

随着对象变量,事情变得有点复杂:

 

这一部分数字1-5其实跟上面是一样的,这里,数据是字符串(由双引号包含着)。

  1. 星号(*)可能有点让你迷惑。这个不是变量名字的一部分。它可以放在数据变量和数据类型之间的任何地方,所以下面的语句是一样的:

NSString* title;

NSString * title;

NSString *title;

  *符号实际上是个解引用(de-reference)的操作符,解哪到哪?听起来挺像是指针。他们“指”到实际数据在内存的地址。这个内存里头的地址就是保存数据的真正容器。

  指针是C语言的一部分并且因其非常高效而被使用。当我们在我们的程序里头使用指针,我们只需要存储指针的一个简单备份,也就是内存里头的一块可用的地址。那是相对小的数据。如果我们不存储和复制指针所指向的数据,也许很快就不够内存使用。

  例如,使用简单的指针指向大视频文件,那么在代码里头我们就能使用这个指针来多次使用那个大视频文件的所有的数据。

  好吧,让我们回到星号:什么叫解引用?简单来说,就是我们所要获得的指针所指向内存里存储的值。

  2. At符号(@)加上双引号里头的文本组成“NSString 文本”。如果你有使用其他编程语言习惯,会感到困惑。@符号在Object-C的好几处地方用到,基本上这是一种办法来分辨,@是一种符号用来区分这是Object-C特有而常规C没有,当编译Object-c代码的时候,这点尤其重要。NSString对象不像C语言里头的同行,这就是为什么@符号出现在第一个双引号之前。

 

最后: 静态VS动态 输入

之前我们说过,Object-C是一种静态输入的语言,意味着“必须先声明数据中每个变量(或者容器)的数据类型”。额,说对了一些,但不能说明全部。我不希望在这篇文章太多的探讨这个问题,但是要强调Object-c同样是个动态语言,意味着我们的代码里头的某一部分可以在app运行的时候被扩展和修改(比如,在被编译之后)。

一个例子是使用泛型数据类型id。Id可以用来代表任意数据类型。这是指定数据的最通用的形式,它被简单的用来作为引用数据的一个标识符。这种动态类型允许我们我们编写更灵活的代码。在IOS,我们经常看到id被用来控制屏幕的方法,就像:

- (IBAction)save:(id)sender;

这就是方法的声明,我们在之后的文章的会谈及这。注意sender参数是一种id类型。这给我们的app提供了一种便利,app不需要关心sender是一个按钮还是图片还是其他能触发事件的东西。

敬请期待

还有很多关于Object-c的基本语法和概念,请关注之后的关于类,消息/方法/函数,条件和循环方面的文章。如果你想用你的浏览器试试,看看这个“ Build a Simple iPhone App”,这里头包含一些让人激动的代码来你得到Object的实践。

posted on 2013-12-04 11:52  波波夫  阅读(8206)  评论(0编辑  收藏  举报