位置:首页 > 高级语言 > Objective-C在线教程 > Objective-C 类&对象

Objective-C 类&对象

Objective-C编程语言的主要目的是增加面向对象的 C++编程语言,类是核心支持面向对象编程及 Objective-C 的特点,通常被称为用户定义的类型。

类是用来指定对象的形式,它结合了数据表示和方法操纵这些数据转换成一个整齐的包。在一个类的数据和方法,被称为类的成员。

Objective-C的特点

  • 类定义在两个不同的部分,即 @interface 和 @implementation.

  • 几乎所有东西都以对象的形式。

  • 对象接收消息和对象通常被称为接收器。

  • 对象包含实例变量。

  • 对象和实例变量的范围。

  • 类隐藏对象的实现。

  • 属性是用来提供访问其他类的类的实例变量。

Objective-C的类定义:

当定义一个类,定义的数据类型的结构。 这实际上并不定义任何数据,但它定义的类的名字的意思是什么,即是什么类的对象将包括这样一个对象上执行什么操作可以。

类定义开始用关键字 @interface 接口(类)的名称和类主体,由一对花括号括起来。 Objective-C中所有的类都派生自基类NSObject。它是所有的Objective-C类的超类。它提供了基本的方法,如内存分配和初始化。例如,我们定义框数据类型使用关键字 class 如下:

@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

属性:

Objective-C中引入的属性,以确保类的实例变量可以在类的外部访问。

各部分属性声明如下。
  • 属性由@property开始,这是一个关键字
  • 其次是访问指示符,非原子或原子,读写或只读强,unsafe_unretained 或弱。变化根据不同的变量。对于任何类型的指针,我们可以使用强大或unsafe_unretained。同样,对于其他类型,我们可以使用读写或只读。
  • 其次是数据类型的变量。
  • 最后,我们必须以分号结束的属性名称。
  • 我们可以在实现类中添加合成语句。但在最新的Xcode,合成部分XCode在生成,需要不包括合成语句。

这是唯一可能的属性,我们可以访问类的实例变量。其实内部的属性创建getter和setter方法​​。

例如,让我们假设我们有一个属性@property (nonatomic ,readonly ) BOOL isDone。有如下图所示,创建 getter 和 setter 方法​​。

-(void)setIsDone(BOOL)isDone;
-(BOOL)isDone;