Objective-C類和對象

Objective-C編程語言的主要目的是為C編程語言添加面向對象,類是Objective-C的核心特性,支持面向對象編程,通常稱為用戶定義類型。

類用於指定對象的形式,它將數據表示和方法組合在一起,以便將數據操作到一個整齊的包中。 類中的數據和方法稱為類的成員。

1. Objective-C特徵

  • 類定義在兩個不同的部分,即@interface@implementation
  • 幾乎所有東西都是對象的形式。
  • 對象接收消息,對象通常稱為接收者。
  • 對象包含實例變數。
  • 對象和實例變數具有範圍。
  • 類隱藏對象的實現。
  • 屬性用於提供用於其他類對此類實例變數的訪問。

2. Objective-C類定義

定義類時,可以為數據類型定義藍圖(或範本)。 但實際上並沒有定義任何數據,但它確實定義了類名的含義,即類的對象將包含什麼以及可以對這樣的對象執行什麼操作。

類定義以關鍵字@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

實例變數是私有的,只能在類實現中訪問。

3. 分配和初始化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

box1box2這兩個對象都有自己的數據成員副本。

4. 訪問數據成員

使用成員訪問運算符(.)訪問類對象的屬性。嘗試下麵的例子來理解 -

#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

5. 屬性

在Objective-C中引入了屬性,以確保可以在類外部訪問類的實例變數。

各部分屬性聲明如下 -

  • 屬性以@property開頭,它是一個關鍵字
  • 接下來是訪問說明符,它們是非原子,讀寫或只讀,強,不安全或不完整。 這取決於變數的類型。 對於任何指針類型,可以使用strongunsafe_unretainedweak。 類似地,對於其他類型,可以使用readwritereadonly
  • 接下來是變數的數據類型。
  • 最後,將屬性名稱以分號結束。
  • 在實現類中添加synthesize語句。 但是在最新的XCode中,合成部分由XCode處理,不需要包含synthesize語句。

只有屬性才能訪問類的實例變數。 實際上,為屬性創建了內部gettersetter方法。
例如,假設有一個屬性@property(nonatomic,readonly)BOOL isDone。 創建了settergetter,如下所示。

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

上一篇: Objective-C命令行參數 下一篇: Objective-C繼承