位置:首頁 > 高級語言 > 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;