ios应用开发Objective-C入门教材


   Objective-C是一种 方便的计算机语言,它 可以用来设计复杂的面向对象程序 。 Objective-C 扩大了 标准ANSI C语言,添加了一些定义类、 步骤以及其它 构造的语法, 晋升了类的动态 扩大 。

   重点: 本文档没有 传授任何有对于C语言的 常识 。假如你还不 相熟C语言,浏览本文之前应该学习一下C语言的 根底 常识 。

   假如你已经 相熟C语言,而且之前 使用过面向对象语言编写过程序,下面的内容将会协助你学习Objective-C的 根底语法 。 许多传统面向对象的 思维, 比方封装、继承、多态,都会在Objective-C中体现 。 固然也有一些主要的不同点,但这些不同点都会在这篇文章中提到,假如需求有更多 详尽信息可用 。

   Objective-C: C语言的超集

   Objective-C是C语言ANSI版本的超集, 支撑和C 雷同的 根本语法 。用C代码,你 可以定义头文件和源码文件, 以从 详尽实现的代码中 拆散出公开的申明 。 Objective-C头文件下面列出的 扩大名 Table 1-1.

Table 1-1 Objective-C代码的文件 扩大名 扩大名文件类型

扩大名

文件类型

.h

头文件 。头文件包括类、类型、函数、常量的申明 。

.m

源码文件 。这是源码文件的典型 扩大名, 可以包括Objective-C和C代码 。

.mm

源码文件 。 使用该 扩大名的源文件除了Objective-C和C代码,还 可以包括C++代码 。 该 扩大名仅用于在你的Objective-C代码中 引用到的C++类和 特点 。

   当你想在你的代码中包括头文件时,你 可以 使用 #import 指令 。 它 比较像 #include, 除了它必须要确定 雷同文件不能被包括 频繁 。 Objective-C的示例和文档都更喜爱 使用 #import, 你的代码应该也这样 。

   

   和大多数其它面向对象语言一样,Objective-C里的类也提供 根本的 构造,用来封装带有行为的一些数据 。 一个对象是一个类的运行实例,包括类中申明变量的实例在内存中的复制,以及指向该类的 步骤 。

   Objective-C中类的定义,要求两个显而易见的 部分:接口和实现 。 接口 部分包括类的申明、定义成员变量,及与此类关联的 步骤 。 接口通常在a .h 文件里 。实现 部分包括类的 步骤实际代码 。实现通常在 a .m 文件里 。

   图1-1 展示申明MyClass类的语法, 它继承自Cocoa的基类 NSObject 。 这个类的申明开始于 @interface 编译指令, 完毕于 @end 指令 。仅跟着类名的(以冒号分割)是父类名 。 类的实体变量(有时简称ivars,在一些其它语言中称作成员变量)申明在以大括号({和})括起来的代码块中 。 实体变量后面是类的 步骤申明列表 。以分号做为每个实体变量和 步骤的 完毕标记 。

A class declaration

图1-1 定义一个类

   小 揭示: 这个接口只申明了 步骤,类也 可以申明 属性 。 了解属性的更多信息, 请查看 “申明属性”.

   Objective-C 支撑包括对象的强弱两个类型的变量 。 在变量申明时,强类型的变量包括类名,弱类型的变量 使用类型 id 接替对象 。 弱类型变量在像 集中类中 使用频繁,在一个 集中中的对象的实际类型可能是未知的 。假如你 使用过强类型的语言, 你可能会认为 使用弱类型会引起问题,然而在Objective-C程序中它们实际上提供了很大的灵便性和更 壮大的动态性 。

   下面的例子 展示了强类型和弱类型变量的申明 格局:

  1. MyClass *myObject1; // 强类型 
  2.  
  3. id myObject2; // 弱类型 

    留神在第一个申明里的 * 号 。在Objective-C中,对象的 引用叫指针 。假如你对指针没有很清楚的 意识, 不用 担心,不是必须要成为一个指针专家 威力 使用Objective-C进行编程的 。你 惟独记住在申明强类型对象的变量名前外加 * 就 可以了 。 弱类型 id 本身就 象征着是个指针 。

    步骤和通讯

   Objective-C中的类 可以申明两 品种型的 步骤:实体 步骤和类 步骤 。 一个实体 步骤是在这个特定类的实例中 威力执行的 步骤,换句话说, 在调用实体 步骤前,你必须首先要 缔造这个类的实例 。类 步骤, 绝对的,不需求 缔造实例 。 固然更 可以在 缔造实例之后调用 。

    步骤的申明由 步骤的类型标识符、一个返回值类型、一个或多个签名 要害字、参数类型和名称信息构成 。 图1-2 展示实体 步骤 insertObject:atIndex:的申明 格局 。

Method declaration syntax

图1-2 步骤申明的语法

   申明开始于减号(-) ,减号用来标识这是一个实体 步骤 。这个 步骤的实际名称 (insertObject:atIndex:) 是全部签名 要害字的拼接,包括冒号 。 冒号申明了目前的参数.假如 步骤没有参数,你就 可以省略第一个签名 要害字 。 在这个例子中,该 步骤有两个参数 。

   当你想调用这个 步骤时,你 可以通过向对象 通讯  。 通讯内容是 步骤签名和 步骤要求参数信息 。

   信息是用中括号 ([ 和 ])包裹的 。 在中括号里面, 接纳信息的对象在左边,信息(包括信息要求的参数)在右边 。 例如,发送信息insertObject:atIndex: 到变量名为 myArray 的对象,你会用到下面的语法:

  1. [myArray insertObject:anObject atIndex:0]; 

   为了幸免申明多个 部分变量来 保留暂时 后果, Objective-C同意你嵌套信息 。来自每个嵌套信息中的返回值, 可以被用做参数、 指标、或另一个信息 。 例如,你 可以用信息来 接替前面例子中任意 使用过的变量 。从而,假如你有一个叫 myAppObject 的对象,它有 拜访数组对象和将对象插入数组的 步骤, 你 可以将前面的例子写成像下面这样:

  1. [[myAppObject theArray] insertObject:[myAppObject objectToInsert] atIndex:0]; 

   Objective-C也提供用句点来调用 存取器 步骤 。 存取器 步骤猎取和设置一个对象的状态, 典型的 格局为 -(type)propertyName 和 -(void)setPropertyName:(type) 。 使用句点语法,你 可以将前面的例子重写成:

  1. [myAppObject.theArray insertObject:[myAppObject objectToInsert] atIndex:0]; 

   你也能 使用句点语法赋值:

  1. myAppObject.theArray = aNewArray

   用不同语法写也 比较 方便, [myAppObject setTheArray:aNewArray];.

    只管前面的例子都是发送信息给一个类的实例,你也 可以发送信息到类 本身 。 当你要通讯到一个类,你指定的 步骤必须被定义成一个类 步骤,而非实体 步骤 。

   典型的,你 使用类 步骤来 缔造类的新实例,或 拜访有关此类的一些共享信息 。 类 步骤的申明语法除了丝毫不同,其它 彻底和实体 步骤一样 。 用加号(+)来 接替用减号(-)作为 步骤类型的标识符 。

   下面的例子便是来 注明如何 使用类 步骤作为一个类的工厂 步骤 。 在这个例子中, 步骤 array 是类 NSArray 的类 步骤—继承自 NSMutableArray— 它用于 调配和初始化该类的新实例并将它的返回到代码中 。

  1. NSMutableArray *myArray = nil; // nil等同NULL 
  2.  
  3. //  缔造一些新数组并赋给变量myArray 。 
  4.  
  5. myArray = [NSMutableArray array]; 

   清单1-1 展示类了在前面例子中 MyClass 类的实现代码 。 像类的申明一样,类的实现通过两个编译指令 鉴别 —这里, @implementation 和 @end 。 这些指令提供编译器需求的 规模信息,来定位 绝对应类的 关闭 步骤 。 步骤的申明要匹配接口中相应的申明,不包括代码块里的内容 。

   清单1-1 一个类的实现

  1. @implementation MyClass 
  2.  
  3. - (id)initWithString:(NSString *)aName 
  4.  
  5.  
  6. self = [super init]; 
  7.  
  8. if (self) { 
  9.  
  10. name = [aName copy]; 
  11.  
  12.  
  13. return self; 
  14.  
  15.  
  16. + (MyClass *)createMyClassWithString: (NSString *)aName 
  17.  
  18.  
  19. return [[[self alloc] initWithString:aName] autorelease]; 
  20.  
  21.  
  22. @end