Đối tượng & Lớp Objective-C

Mục đích chính của ngôn ngữ lập trình Objective-C là thêm hướng đối tượng vào ngôn ngữ lập trình C và các lớp là tính năng trung tâm của Objective-C hỗ trợ lập trình hướng đối tượng và thường được gọi là kiểu do người dùng định nghĩa.

Một lớp được sử dụng để chỉ định dạng của một đối tượng và nó kết hợp biểu diễn dữ liệu và các phương thức để thao tác dữ liệu đó thành một gói gọn gàng. Dữ liệu và phương thức trong một lớp được gọi là thành viên của lớp.

Đặc tính Objective-C

  • Lớp được định nghĩa trong hai phần khác nhau, cụ thể là @interface@implementation.

  • Hầu hết mọi thứ đều ở dạng vật thể.

  • Đối tượng nhận thông điệp và đối tượng thường được gọi là người nhận.

  • Các đối tượng chứa các biến thể hiện.

  • Các đối tượng và biến cá thể có phạm vi.

  • Các lớp ẩn hiện thực của một đối tượng.

  • Thuộc tính được sử dụng để cung cấp quyền truy cập vào các biến cá thể của lớp trong các lớp khác.

Định nghĩa Lớp Objective-C

Khi bạn xác định một lớp, bạn xác định một bản thiết kế cho một kiểu dữ liệu. Điều này không thực sự xác định bất kỳ dữ liệu nào, nhưng nó xác định ý nghĩa của tên lớp, nghĩa là, một đối tượng của lớp sẽ bao gồm những gì và những thao tác nào có thể được thực hiện trên một đối tượng như vậy.

Định nghĩa lớp bắt đầu bằng từ khóa @interfacetiếp theo là tên giao diện (lớp); và phần thân của lớp, được bao bởi một cặp dấu ngoặc nhọn. Trong Objective-C, tất cả các lớp đều bắt nguồn từ lớp cơ sở được gọi làNSObject. Nó là lớp cha của tất cả các lớp Objective-C. Nó cung cấp các phương thức cơ bản như cấp phát và khởi tạo bộ nhớ. Ví dụ: chúng tôi đã xác định kiểu dữ liệu Hộp bằng từ khóaclass như sau -

@interface Box:NSObject {
   //Instance variables
   double length;    // Length of a box
   double breadth;   // Breadth of a box
}
@property(nonatomic, readwrite) double height;  // Property

@end

Các biến cá thể là riêng tư và chỉ có thể truy cập được bên trong việc triển khai lớp.

Phân bổ và khởi tạo đối tượng Objective-C

Một lớp cung cấp bản thiết kế cho các đối tượng, vì vậy về cơ bản một đối tượng được tạo ra từ một lớp. Chúng ta khai báo các đối tượng của một lớp với cùng kiểu khai báo mà chúng ta khai báo các biến kiểu cơ bản. Các câu lệnh sau khai báo hai đối tượng của lớp Box:

Box box1 = [[Box alloc]init];     // Create box1 object of type Box
Box box2 = [[Box alloc]init];     // Create box2 object of type Box

Cả hai đối tượng box1 và box2 sẽ có bản sao dữ liệu của riêng chúng.

Truy cập các thành viên dữ liệu

Các thuộc tính của các đối tượng của một lớp có thể được truy cập bằng toán tử truy cập thành viên trực tiếp (.). Chúng ta hãy thử ví dụ sau để làm rõ mọi thứ -

#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;
}

Khi đoạn mã trên được biên dịch và thực thi, nó tạo ra kết quả sau:

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

Tính chất

Các thuộc tính được giới thiệu trong Objective-C để đảm bảo rằng biến thể hiện của lớp có thể được truy cập bên ngoài lớp.

Các phần khác nhau là phần khai báo tài sản như sau.
  • Thuộc tính bắt đầu bằng @property, đó là một từ khóa

  • Theo sau nó là các từ chỉ định truy cập, không phải là giải phẫu hoặc nguyên tử, ghi đọc hoặc chỉ đọc và mạnh, không an toàn_ không an toàn hoặc yếu. Điều này thay đổi dựa trên loại biến. Đối với bất kỳ loại con trỏ nào, chúng ta có thể sử dụng strong, secure_unretained hoặc yếu. Tương tự đối với các loại khác, chúng ta có thể sử dụng readwrite hoặc readonly.

  • Tiếp theo là kiểu dữ liệu của biến.

  • Cuối cùng, chúng ta có tên thuộc tính được kết thúc bằng dấu chấm phẩy.

  • Chúng ta có thể thêm câu lệnh tổng hợp trong lớp thực thi. Nhưng trong XCode mới nhất, phần tổng hợp được đảm nhận bởi XCode và bạn không cần bao gồm câu lệnh tổng hợp.

Nó chỉ có thể với các thuộc tính mà chúng ta có thể truy cập các biến cá thể của lớp. Trên thực tế, các phương thức getter và setter bên trong được tạo cho các thuộc tính.

Ví dụ: giả sử chúng ta có một thuộc tính @property (nonatomic ,readonly ) BOOL isDone. Dưới mui xe, có các setters và getters được tạo ra như hình dưới đây.

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