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;