Objective-C编程语言的主要目的是为C编程语言添加面向对象,类是Objective-C的核心特性,支持面向对象编程,通常称为用户定义类型。
类用于指定对象的形式,它将数据表示和方法组合在一起,以便将数据操作到一个整齐的包中。 类中的数据和方法称为类的成员。
@interface
和@implementation
。定义类时,可以为数据类型定义蓝图(或模板)。 但实际上并没有定义任何数据,但它确实定义了类名的含义,即类的对象将包含什么以及可以对这样的对象执行什么操作。
类定义以关键字@interface
开头,后跟接口(类)名称; 和一个由一对花括号括起来的类体。 在Objective-C中,所有类都派生自名为NSObject
的基类。 它是所有Objective-C类的超类。 它提供了内存分配和初始化等基本方法。 例如,使用关键字class
定义Box
类,如下所示 -
@interface Box:NSObject { //实例变量 double length; // Length of a box double breadth; // Breadth of a box } @property(nonatomic, readwrite) double height; // Property @end
实例变量是私有的,只能在类实现中访问。
类提供对象的蓝图,因此基本上是从类创建对象。声明一个类的对象与声明基本类型变量的声明完全相同。以下语句声明了Box
类的两个对象 -
Box box1 = [[Box alloc]init]; // Create box1 object of type Box Box box2 = [[Box alloc]init]; // Create box2 object of type Box
box1
和box2
这两个对象都有自己的数据成员副本。
使用成员访问运算符(.
)访问类对象的属性。尝试下面的例子来理解 -
#import <Foundation/Foundation.h> @interface Box:NSObject { double length; // Length of a box double breadth; // Breadth of a box double height; // Height of a box } @property(nonatomic, readwrite) double height; // Property -(double) volume; @end @implementation Box @synthesize height; -(id)init { self = [super init]; length = 1.0; breadth = 1.0; return self; } -(double) volume { return length*breadth*height; } @end int main() { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; Box *box1 = [[Box alloc]init]; // Create box1 object of type Box Box *box2 = [[Box alloc]init]; // Create box2 object of type Box double volume = 0.0; // Store the volume of a box here // box 1 分配值 box1.height = 15.0; // box 2 分配值 box2.height = 20.0; // volume of box 1 volume = [box1 volume]; NSLog(@"Volume of Box1 : %f", volume); // volume of box 2 volume = [box2 volume]; NSLog(@"Volume of Box2 : %f", volume); [pool drain]; return 0; }
执行上面示例代码,得到以下结果:
$main 2018-11-16 01:29:42.781 main[106799] Volume of Box1 : 15.000000 2018-11-16 01:29:42.782 main[106799] Volume of Box2 : 20.000000
在Objective-C中引入了属性,以确保可以在类外部访问类的实例变量。
各部分属性声明如下 -
@property
开头,它是一个关键字strong
,unsafe_unretained
或weak
。 类似地,对于其他类型,可以使用readwrite
或readonly
。synthesize
语句。 但是在最新的XCode
中,合成部分由XCode
处理,不需要包含synthesize
语句。只有属性才能访问类的实例变量。 实际上,为属性创建了内部getter
和setter
方法。
例如,假设有一个属性@property(nonatomic,readonly)BOOL isDone
。 创建了setter
和getter
,如下所示。
-(void)setIsDone(BOOL)isDone; -(BOOL)isDone;