概述
Objective-C作为一种面向对象的编程语言,具有面向对象的基本特征,即:封装、继承和多态。主要介绍Objective-C中有关面向对象基本概念:类、对象、方法和属性等。
Objective-C中的类
类是Objective-C中的一种重要的数据类型,是组成Objective-C程序的基本要素。Objective-C的类声明和实现包括两个部分:接口部分和实现部分。
@interface Song: NSObject { ...... } ...... @end @implementation Song ...... @end
接口部分
使用关键字@interface,主要定义了类名、继承的父类、实现的协议、成员变量和方法等信息。下面的代码是Song类的接口部分声明。
@interface Song : NSObject { NSString *title; NSString *artist; long int duration; } - (void)start; - (void)stop; - (void)seek:(long int)time; @end
实现部分
使用关键字@implementation,主要实现了在接口部分定义的方法等信息。下面的代码是Song类的实现部分声明。
@implementation Song - (void)start { //开始播放 } - (void)stop { //停止播放 } - (void)seek:(long int)time { //跳过时间 } @end
方法和消息
Objective-C中方法定义非常古怪,它遵循了SmallTalk语法风格,它将一个方法名字分成几个部分。
说明:
•
定义了两个参数的方法,第一个参数是anObject,参数类型是id类型,第二个参数是index,参数类型是NSUInteger,这叫做多重参数。它的返回类型是void,方法签名是insertObject:atIndex:。方法类型标识符中都“-”代表方法是实例方法,“+”代表方法是类方法,关于实例方法和类方法我们将在后面内容中讨论。如果上面的方法变成C或C++形式,则是下面的样子的:
•
-(void) insertObjectAtIndex(id anObject, NSUInteger index)
消息发送
对于方法的调用通常也不称之为调用,而是称为发出消息,操作符号不是“.”而是“[⋯]”,如下所示:
[myObject insertObject: ojb1 atIndex:0];
即向myObject对象发出一个消息insertObject:atIndex:。而在实际使用时候这两种叫法都会用,这不是严格划分。
访问成员变量
从面向对象的封装角度考虑问题,要想访问类中的成员变量,是要通过方法访问的,成员变量前面要有作用域限定符(protected, public, private),这些存取权限修饰符我们将在后面介绍。
成员变量的访问,是通过读取方法(getter)和设定方法(setter)。
Song.h文件:
@interface Song : NSObject { NSString *title; NSString *artist; long int duration; } //操作方法 - (void)start; - (void)stop; - (void)seek:(long int)time; //访问成员变量方法 - (NSString *)title; - (void)setTitle:(NSString *)newTitle; - (NSString *)artist; - (void)setArtist:(NSString *)newArtist; - (long int)duration; - (void)setDuration:(long int)newDuration; @end
Song.m文件:
@implementation Song - (void)start { //开始播放 - (void)stop { //停止播放 - (void)seek:(long int)time { //跳过时间 ... ...
//访问成员变量方法 - (NSString *)title { return title; } - (void)setTitle:(NSString *)newTitle { title = newTitle; } - (NSString *)artist { return artist; } - (void)setArtist:(NSString *)newArtist { artist = newArtist; } - (long int)duration { return duration; } - (void)setDuration:(long int)newDuration { } @end
小结
采用了封装之后就可以通过存取方法访问属性,例如[mySong title]是取得title成员变量内容。
如果不考虑封装的问题,单从技术上讲Objective-C,可以直接通过对象访问成员变量的,访问操作符是“->”,例如:mySong->title,也可以取得title成员变量的内容。