黑马程序员技术交流社区

标题: OC中的类和对象 [打印本页]

作者: jing397    时间: 2015-10-10 21:27
标题: OC中的类和对象
和其他大部分面向对象编程语言一样,Objective-C 中的类也支持封装数据,以及定义可以在该数据上执行的动作。对象是运行时类的一个实例。在类里声明了的实例变量和方法,它的每个实例都在内存中拥有同样的实例变量,以及指向那些方法的指针。创建一个对象时,你需要经过两个步骤:内存分配(allocation)和初始化(initialization)。

Objective-C 中的类有自己的规范要求,必须包括两个不同的部分:接口(interface)和实现(implementation)。接口部分含有类的声明、实例变量和相关方法的声明。既然是作为 C 语言,通过分别定义头文件和源文件,你就可以将公有声明和具体的实现代码给分离开来。(你可以在实现文件里放一些声明代码,因为有些情况下,它们共同构成一个公用程序里的接口部分。)下表列出了这些文件的后缀以及区别:

后缀、源文件类型:

如果需要在源代码中包含头文件,你需要使用 #import 命令,和 C 语言中的 #include 命令类似。两者的区别在于,#import 能够保证头文件只被包含一次。

图 1 中是一段的类声明的语法展示,声明了一个叫做 MyClass 的类,它继承于基本类(或根类):NSObject。(根类可以被所有的其他类直接或间接继承。)类声明开头是一条编译器指令 @interface,结尾是一条 @end 指令。在类名称后边(中间用冒号分隔),是父类的名称。在 Objective-C 中,每个类只能有一个父类。类中包含的实例变量(有时被称为 ivar,在其他编程语言中有时被称为成员变量)的声明被一个花括号({ 和 })包裹起来。实例变量是可选的。在实例变量语句块下边是属性(图中没有写出来)和类的方法声明。每个实例变量和方法声明的语句结尾都要有一个分号。

图 1 一段类声明

类的实现的语法也是类似的。开头是编译器指令 @implementation(后面有类的名称),结尾是 @end 指令。方法的实现代码就在这两个指令的中间。实现代码中必须导入它的接口文件,写在代码的第一行。

#import “MyClass.h”
@implementation MyClass
- (id)initWithString:(NSString *)aName
{
    // 在这里书写代码
}
+ (MyClass *)myClassWithString:(NSString *)aName
{
    // 在这里书写代码
}
@end

我们之前讲过,Objective-C 支持包含对象的动态类型变量,它同时也支持静态类性。静态类型变量的声明前边要有所述类的名称。而动态类型变量声明以 id 来代表对象。在某些情形下,你会用到动态类型变量。比如,一个数组这样的对象集合(里面包含的对象类型可能是无法预知的)就会用到动态类型变量。这样的变量能够提供无比灵活的功能,使得 Objective-C 程序能够拥有更大的动态性。

下面的例子展示了静态类型和动态类型变量的声明方式:

MyClass *myObject1;  // 静态类性
id             myObject2;  // 动态类型
NSString *userName;  // 曾出现在“你的第一个 iOS 应用”中(静态类型)

请注意第一个声明里的 * 星号。在 Objective-C 语言中,对象永远是通过指针来引用的。如果现在你还不能明白这句话的意思也不必担心,在学会Objective-C 基础之后再研究指针也不迟。现在你需要记住的,是在静态类型变量声明时,变量名称前面一定要有 * 星号。而 id 类型则暗示它是一个指针。



作者: jing397    时间: 2015-10-11 13:26
学习一下!!!
作者: Alphts_ZWJuJ    时间: 2015-10-11 15:18
学习一下
作者: 豆豆是只喵    时间: 2015-10-11 17:59
顶顶顶顶顶顶顶顶,66666
作者: jing397    时间: 2015-10-12 00:18
支持支持!!
作者: 于鸿鹏    时间: 2015-10-12 07:58
还会基础的看着有点吃力  
作者: jing397    时间: 2015-10-12 12:38
顶一下!!!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2