类和对象(Classes & Objects)
Objective-C编程语言的主要目的是为C编程语言添加面向对象,类是Objective-C的核心特性,支持面向对象编程,通常称为用户定义类型。
类用于指定对象的形式,它将数据表示和方法组合在一起,以便将数据操作到一个整齐的包中。 类中的数据和方法称为类的成员。
Objective-C Characteristic
该类定义在两个不同的部分,即@interface和@implementation 。
几乎所有东西都是物体的形式。
对象接收消息,对象通常称为接收者。
对象包含实例变量。
对象和实例变量具有范围。
类隐藏对象的实现。
属性用于提供对其他类中的类实例变量的访问。
Objective-C类定义
定义类时,可以为数据类型定义蓝图。 这实际上并没有定义任何数据,但它确实定义了类名的含义,即类的对象将包含什么以及可以对这样的对象执行什么操作。
类定义以关键字@interface开头,后跟接口(类)名称; 和一个由一对花括号括起来的类体。 在Objective-C中,所有类都派生自名为NSObject的基类。 它是所有Objective-C类的超类。 它提供了内存分配和初始化等基本方法。 例如,我们使用关键字class定义Box数据类型,如下所示 -
@interface Box:NSObject {
//Instance variables
double length; // Length of a box
double breadth; // Breadth of a box
}
@property(nonatomic, readwrite) double height; // Property
@end
实例变量是私有的,只能在类实现中访问。
分配和初始化Objective-C对象
类提供对象的蓝图,因此基本上是从类创建对象。 我们声明一个类的对象与我们声明基本类型变量的声明完全相同。 以下语句声明了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 specification
box1.height = 5.0;
// box 2 specification
box2.height = 10.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;
}
编译并执行上述代码时,会产生以下结果 -
2013-09-22 21:25:33.314 ClassAndObjects[387:303] Volume of Box1 : 5.000000
2013-09-22 21:25:33.316 ClassAndObjects[387:303] Volume of Box2 : 10.000000
属性 Properties
在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;