Object-C 类

发布时间:2017-09-10 10:58:19
Object-C 类

像其他的面向对象的语言一样,Object-C也提供创建对象的蓝本,即类。首先我们在类中定义一些可以重复使用的属性和方法。然后,我们实例化类,即对象,之后就可以使用属性和访问。

Object-C和C++一样,从类的实现中抽象出了类的接口。接口中定义了类的公开的方法和属性,相应的实现代码,定义方法和属性的具体的实现。这和我们看到的函数,分离关注点是一样的。

A class’s interface and implementation

这张我们将学习关于类接口,实现、属性、方法已经实例化的基本语法。我们也会介绍Object-C的内省和反射的功能。

Creating Classes 创建对象

我们将定义一个叫Car的类,他的接口在Car.h文件中,他的实现在Car.m 文件中。这些是标准的Object-C的文件扩展名。当其他的类想使用这个类的功能时,需要使用这个类的头文件,而类的实现文件是给编译器使用的。

xcode 提供方便的创建类的模板。我们可以从 File > New > File …或者Cmd + N 快捷键创建类。在模板中从iOS > Cocoa Touch中选择Object-C类模板。之后,提示您配置一些信息:

创建类

在Class 域中填写Car。在subclass of 中选择NSobject。NSObject 类是其他所有Object-C类的父类。点击下一步,提示选择文件存储的位置,选择存储在工程根目录下。在对话框的下面,注意选择您的工程为目标工程。这样是保证文件会被编译。

Object-C 类

点击next后,您会在Xcode的工程导航中看到Car.h文件和Car.m文件。如果您选择工程名称,在编译资源模块中,您会发现在Car.m文件在构建路径中。任何您想让编译器编译的文件都必须在这个类表中。

Interfaces 接口

Car.h 文件中包含一些样板代码,从现在开始,我们修改如下,声明一个叫model的变量和一个叫drive的方法。

// Car.h #import @interface Car : NSObject { // Protected instance variables (not recommended) } @property (copy) NSString *model; - (void)drive; @end

通过@interface指令创建接口,后面接着类的名字和父类的名字,中间用冒号隔开。保护类型的变量可以定时在花括号内。大多数开发者喜欢讲实例变量放在.m文件中,而不是头文件中。

@property 声明一个public 类型的变量,而且通过copy定义内存管理行为。这种情况下,赋值给model变量的值,是一个副本,而不是直接指向值。在属性章节我们将会讨论更多的细节。接下来是属性的数据类型和名字,就像普通的变量声明一样。

以- (void)开头的行,定义了一个叫drive的函数,没有参数, (void) 部分定义函数的返回值类型。在方法前面的减号,表示一个实例方法,与之相对应的是类方法。

Implementations 实现

任何类的实现,第一件事是引入相对应的头文件。 @implementation 和@interface是一样的,除了不需要父类。私有的变量可以定义在类名之后的括号中。

// Car.m #import "Car.h" @implementation Car { // Private instance variables double _odometer; } @synthesize model = _model; // Optional for Xcode 4.4+ - (void)drive { NSLog(@"Driving a %@. Vrooooom!", self.model); } @end

@synthesize 帮助我们为属性产生存取方法(getter和setter方法)。默认,getter方式是属性名(model),setter方法是set前缀加属性名首字符大写,这样比手动写每一个存储器的特征方便。_model 部分定义了属性的私有实例变量名。

xcode 4.4 之后,用@property声明的属性变量,自动产生存取方法。如果您认为默认的实例变量命名规则可以,您可以省略@synthesize行。

drive方法的实现和接口中有相同的方法签名,但是在签名之后,有方法调用时执行的代码。我们是通过self.model 获取model的值,而不是通过_model。这是最佳实践,利用了属性的存储方法。只有在init方法和dealloc方法中您才需要直接访问实例变量。

self 关键是指向方法调用的实例。除了获取属性值,还可以调用方法。在教程中您将看到很多这样的例子。

Instantiation and Usage 实例化和用法

任何想访问类的文件,都要引入类的头文件,我们绝对不能直接访问类的实现。这样将违反了,分离实现和接口的目的。所以,为了让我们类生效,如下修改main.m.

// main.m #import #import "Car.h" int main(int argc, const char * argv[]) { @autoreleasepool { Car *toyota = [[Car alloc] init]; [toyota setModel:@"Toyota Corolla"]; NSLog(@"Created a %@", [toyota model]); toyota.model = @"Toyota Camry"; NSLog(@"Changed the car to a %@", toyota.model); [toyota drive]; } return 0; }

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:仙桃SEO http://xiantao.raoyu.net