Lớp, đối tượng và thông điệp

Một phần của tài liệu Xây dựng ứng dụng tìm kiếm đa phương tiện trên điện thoại iphone (Trang 33 - 37)

a. Runtime:

Ngôn ngữ Objective-C giảm nhẹ tới mức tối thiểu những việc cần làm tại thời gian biên dịch (compile time) và liên kết (link time) để đẩy hết cho lúc chạy (runtime). Bất cứ khi nào có thể, nó tự động thực hiện các hoạt động như tạo các đối tượng và xác định xem sẽ gọi phương thức nào. Điều này có nghĩa rằng ngôn ngữ không chỉ đòi hỏi một trình biên dịch, mà còn cần một runtime system để thực thi mã biên dịch. Runtime system hoạt động như một loại hệ điều hành cho ngôn ngữ Objective-C vì nhờ nó mà ngôn ngữ này mới có thể làm việc. Tuy nhiên, các lập trình viên không nhất thiết phải tương tác trực tiếp với runtime.

b. Đối tượng:

Khái niệm đối tượng trong Objective-C không khác so với trong các ngôn ngữ lập trình hướng đối tượng khác như là Java , C++ hay C#. Đối tượng bao gồm các thuộc tính và các phương thức.

*id: Trong Objective-C, định danh của đối tượng là một loại dữ liệu đặc biệt: id.

Đây là kiểu chung cho bất kỳ loại đối tượng nào kể cả lớp. (Nó có thể được sử dụng

cho cả thể hiện của lớp và chính bản thân đối tượng lớp) . id là con trỏ tới cấu trúc dữ

liệu đối tượng:

Class isa; } *id;

Do đó, tất cả các đối tượng đều chứa biến thành phần isa để xác định xem nó là

thể hiện của lớp nào.

Giống như một hàm hay màng của C, một đối tượng được xác định bởi địa chỉ của nó. Tất cả các đối tượng, bất kể biến và phương thức thành phần của nó là gì, đều thuộc loại id.

id anObject;

*Xác định kiểu dữ liệu động: Kiểu dữ liệu id có thể đại diện cho tất cả các đối tượng tuy nhiên bản thân nó lại không chứa bất kỳ thông tin nào về đối tượng, ngoài việc chỉ ra rằng đó là một đối tượng. Nhưng các đối tượng không hề giống nhau. Khi cần thiết, chương trình cần phải tìm thêm thông tin cụ thể về đối tượng: chứa các dữ

liệu kiểu gì, có các phương thức nào. Bởi vì kiểu dữ liệu id không thể cung cấp thông

tin này cho trình biên dịch nên các đối tượng phải có khả năng cung cấp các thông tin này khi chạy.

Thuộc tính isa xác định lớp của đối tượng nghĩa là xác định xem đối tượng đó

thuộc loại gì. Các đối tượng có cùng các phương thức và các biến thành phần là thành viên của cùng một lớp.

Do đó các đối tượng được xác định kiểu dữ liệu động khi chạy. Bất cứ khi nào nó cần, runtime system có thể tìm thấy chính xác lớp của một đối tượng. Xác định kiểu dữ liệu động là nền tảng cho ràng buộc động (dynamic binding), được trình bày sau đây.

Biến isa cũng cho phép các đối tượng tự tìm hiểu về bản thân mình. Trình biên

dịch ghi lại các thông tin về định nghĩa lớp trong cấu trúc dữ liệu được dùng cho

runtime system. Các hàm của runtime system sử dụng isa để tìm thông tin này khi

chạy.

*Quản lý bộ nhớ: Trong một chương trình Objective-C, việc đảm bảo rằng các đối tượng được giải phóng khỏi bộ nhớ khi không còn cần thiết nữa hết sức quan trọng nếu không bộ nhớ ứng dụng sẽ trở nên lớn hơn mức cần thiết. Cũng quan trọng để đảm bảo rằng không giải phóng các đối tượng trong khi nó vẫn còn đang được sử dụng.

Objective-C cung cấp hai môi trường quản lý bộ nhớ để đạt được các mục tiêu này:

- Reference counting

- Garabge collection (không có trên iPhone).

c. Thông điệp (message):

* Cú pháp: Để khiến một đối tượng làm gì, cần phải gửi cho nó một thông điệp để nó thực hiện một phương thức nào đó của mình. Trong Objective-C, biểu thức thông điệp được đặt trong dấu ngoặc vuông:

[đối_tượng_nhận thông_điệp]

Trong mã nguồn, thông điệp chính là tên của một phương thức và các tham số được truyền vào cho nó. Khi một thông điệp được gửi đi, runtime system lựa chọn phương thức thích hợp từ các phương thức của đối tượng nhận và chạy nó.

Tên phương thức trong một thông điệp dùng để chọn phương thức thực thi. Vì lý do này, tên phương thức trong thông điệp còn được gọi là “selector”.

Các phương thức có thể nhận số tham số truyền vào tùy ý, cách nhau bởi dấu “:”. Và để tránh nhầm lẫn có thể đặt tên cho các tham số.

Ví dụ:

[myRectangle setOriginX: 30.0 y: 50.0]

Một thông điệp có thể được lồng trong thông điệp khác. Ví du:

[myRectangle setPrimaryColor:[otherRect primaryColor]];

* Gửi thông điệp tới đối tượng nil: trong Objective-C, điều này hoàn toàn hợp lệ, nó chỉ đơn giản không gây hiệu ứng gì trong khi chạy.

*Ràng buộc động (Dynamic Binding): Một khác biệt quan trọng giữa lời gọi hàm và thông điệp là một hàm và các tham số của nó được liên kết với nhau trong mã biên dịch, nhưng thông điệp và đối tượng tiếp nhận không thống nhất cho đến khi chương trình đang chạy và tin nhắn được gửi đi. Vì vậy, phương thức chính xác được gọi để trả lời một phương thức chỉ có thể được xác định tại thời gian chạy, không phải khi mã được biên dịch.

Phương thức chính xác mà một thông điệp gọi sẽ phụ thuộc vào đối tượng nhận. Các đối tượng khác nhau có thể có các phương thức khác nhau thực thi cùng một lời gọi hàm (tính đa hình). Đối với trình biên dịch, để tìm ra phương thức thực thi đúng thông điệp, nó cần phải biết đối tượng đó thuộc lớp nào. Những thông tin này chỉ được đối tượng tiết lộ tại thời gian chạy khi nó nhận được thông điệp (xác định kiểu động).

Việc lựa chọn một phương thức thực hiện sẽ xảy ra khi chạy. Khi một thông điệp được gửi, một runtime messaging rountine sẽ tìm kiếm đối tượng nhận và phương thức có tên trong thông điệp.

Tính ràng buộc động của phương thức (dynamic binding) với các thông điệp kết hợp chặt chẽ với tính đa hình đa hình tạo nên tính linh hoạt và sức mạnh của ngôn ngữ lập trình hướng đối tượng.

d. Lớp (Class):

Lớp định nghĩa một nguyên mẫu cho một loại đối tượng, nó khai báo các biến và định nghĩa một tập hợp các phương thức thành phần.

Mỗi lớp được tạo ra đều phải là lớp con của một lớp khác và nó kế thừa các phương thức cũng như biến thành phần của lớp này. Để thực thi các tác vụ của mình, lớp mới sẽ bổ sung các biến và phương thức mới hay sửa các phương thức mà nó được kế thừa.

*Lớp NSObjects: NSObject là lớp gốc, nên nó không có lớp cha. Nó định nghĩa framework cơ bản cho các đối tượng và tương tác giữa các đối tượng của Objective-C. Những lớp không cần kế thừa các phương thức đặc biệt từ lớp khác có thể là đặt là lớp con của lớp NSObject.

*Đối tượng lớp: Một định nghĩa lớp chứa nhiều thông loại thông tin, chủ yếu là các thành phần của lớp:

- Tên của lớp và lớp cha của nó - Tập các biến thành phần

- Khai báo các phương thức, kiểu trả về và tham số của phương thức đó - Code thực thi các phương thức.

Những thông tin này được biên dịch và ghi lại trong cấu trúc dữ liệu tạo sẵn cho runtime system. Trình biên dịch sẽ chỉ tạo ra một đối tượng, đối tượng lớp, đại diện cho lớp. Đối tượng lớp có quyền truy cập tất cả các thông tin về lớp.

Mặc dù một đối tượng lớp giữ các nguyên mẫu của thể hiện lớp, nó không phải là một thể hiện. Nó không có các biến của riêng nó và nó không thể tự thực hiện phương thức dành cho thể hiện của lớp. Tuy nhiên, một định nghĩa lớp có thể bao gồm các phương thức dành riêng cho các đối tượng lớp gọi là các phương thức tĩnh của lớp. Trong mã nguồn, đối tượng lớp được biểu diễn bằng tên lớp.

*Tạo một thể hiện của lớp: Một chức năng chính của đối tượng lớp là tạo ra

các thể hiện mới của lớp đó. Ví dụ đoạn code sau sẽ yêu cầu lớp Rectangle tạo ra một

thể hiện Rectangle và gán nó cho biến myRectangle:

id myRectangle;

myRectangle = [Rectangle alloc];

Phương thức alloc cấp phát 1 vùng bộ nhớ động cho các biến thành phần của

đối tượng mới và khởi tạo tất cả về 0 ngoại trừ biến isa thể hiện với lớp của nó. Để

đối tượng có thể sử dụng được, nó thường cần phải được khởi tạo. Đó là chức năng của hàm init thường được gọi ngay sau hàm alloc:

myRectangle = [[Rectangle alloc] init];

Một phần của tài liệu Xây dựng ứng dụng tìm kiếm đa phương tiện trên điện thoại iphone (Trang 33 - 37)