2011年5月14日土曜日

HelloWorld application with Objective-C


1. Giới thiệu về ngôn ngữ lập trình Objective C

Objective-C là ngôn ngữ lập trình đã xuất hiện từ rất lâu, nó được thiết kế và phát triển từ năm 1980. Hiện tại, Objective-C lại trở nên phổ biến vì nó được Apple chọn làm ngôn ngữ lập trình cho hệ thống Mac và iPhone.

Objective-C được thiết kế bởi Brad Cox khi ông làm việc cho công ty Stepstone vào đầu những năm 1980. Objective-C được thiết kế để phục vụ mục đích lập trình hướng đối tượng. Nó hoạt động giống như là một tập hợp các thành phần mở rộng rất mạnh mẽ của ngôn ngữ C. Objective-C kết hợp các đặc điểm ưu tú nhất của C và ngôn ngữ SmallTalk. Objective-C khá đơn giản để học và có đầy đủ các khả năng của một ngôn ngữ lập trình hướng đối tượng.

Objective-C đơn giản và nhỏ gọn nhưng lại là một thành phần mở rộng rất mạnh của ngôn ngữ chuẩn ANSI C. Objective-C cung cấp đầy đủ các khả năng lập trình hướng đối tượng nhưng lại được thực thi theo cách khá đơn giản và dễ dàng.

Hầu hết các ngôn ngữ lập trình hướng đối tượng cung cấp:

. Một thư viện các Objects.

. Các công cụ phát triển cần thiết

. Hỗ trợ hướng đối tượng và các thư viện liên quan.

Objective-C cũng cung cấp đầy đủ các thành phần trên. Bạn có thể sử dụng Objective-C để phát triển một phần mềm hoàn thiện. Apple đã chọn Objective-C làm ngôn ngữ lập trình chính cho hệ thống máy Mac và iPhone.

Là ngôn ngữ hướng đối tượng nên Objective-C giải quyết các vấn đề lập trình dựa trên khái niệm các Object. Nó bao gồm 3 phần:

1. Interface

Interface của một lớp(class) thông thường được định nghĩa trong file header với đuôi .h. Nó chính là phần khai báo của một lớp.

2. Implementation

Mã nguồn của chương trình được viết trong phần implementation của một lớp và được định nghĩa trong một file có đuôi .m. Đây là nó phần định nghĩa của lớp.

3.Instantiation

Sau khi khai báo và định nghĩa một lớp, chúng ta có thể thực thể hóa lớp này bằng việc cấp phát bộ nhớ cho new object của lớp đó.

Tóm lại Objective-C là:

- Thành phần mở rộng của ngôn ngữ lập trình C.

- Là ngôn ngữ lập trình hướng đối tượng đơn giản nhưng mạnh mẽ.

- Là ngôn ngữ được Apple sử dụng để phát triển các ứng dụng cho hệ thống máy Mac và iPhone.

2. Tại sao lại sử dụng Objective-C

Ngôn ngữ lập trình Objective-C được chọn cho Cocoa framework vì một số lý do dưới đây:

- Nó là ngôn ngữ lập trình hướng đối tượng và các chức năng cung cấp bởi Cocoa framework chỉ có thể được mang lại bởi các kỹ thuật hướng đối tượng.

- Nó là thành phần mở rộng của chuẩn ANSI C vì vậy các chương trình viết bằng C của framework này sẽ không bị mất đi tính năng nào và người dùng được hưởng các lợi thế của ngôn ngữ C.

Với ngôn ngữ này, người dùng có thể lựa chọn cả lập trình hướng đối tượng và lập trình thủ tục khi cần thiết.

- Nó đơn giản và dễ học bởi cú pháp của nó khá ngắn gọn( cái này nghi ngờ quá :D ) nên nó giúp cho lập trình viên đạt được hiệu quả mong muốn mà không gặp nhiều khó khăn.

- Nó rất năng động nếu so sánh với các ngôn ngữ mở rộng khác dựa trên C. Trình biên dịch đóng một vai trò rất quan trọng trong việc bảo vệ thông tin liên quan đến các đối tượng để sử dụng lúc run time.

- Nó là một ngôn ngữ mạnh bởi vì các quyết định có thể được đưa ra lúc biên dịch sẽ được trì hoãn cho tới khi chương trình chạy.

Sự năng động của Objective-C có hai lợi thế đáng kể:

- Nó hỗ trợ ràng buộc động và mở tạo ra một cấu trúc đơn giản đối với giao diện tương tác người dùng.

- Nó cho phép phát triển các công cụ phát triển phức tạp. Một giao diện cho hệ thống run time tạo điều kiện cho việc tiếp cận các thông tin lúc run time giúp cho việc monitor ứng dụng viết bằng Objective-C.

Trên đây mình vừa giới thiệu với các bạn về ngôn ngữ lập trình Objective-C và các đặc điểm của nó. Ở những bài sau, chúng ta sẽ cùng khám phá cụ thể hơn về cú pháp của Objective-C.

Các Directives được sử dụng để khai báo, định nghĩa các classes, categories, protocols:
Directive Definition
@interface Sử dụng để khai báo một class hay một interface.
@implementation Dùng để định nghĩa một class hay một category.
@protocol Sử dụng để khai báo một thủ tục hình thức (formal protocol).
@end Kết thúc khai báo, định nghĩa category hoặc protocol.

Các Directive được sử dụng để xác định khả năng truy cập của các thực thể. (Mặc định là @protected).
Directive Definition
@private Giới hạn phạm vi truy cập của một biến thực thể chỉ trong lớp mà nó được khai báo.
@protected Giới hạn phạm vi truy cập một biến thực thể trong lớp khai báo nó và các lớp khác kế thừa lớp này.
@public Không giới hạn phạm vi truy cập của biến này.

Các Directives liên quan đến việc xử lý ngoại lệ (Exception handling).
Directive Definition
@try Định nghĩa một khối mã lệnh mà trong khối này có thể phát sinh ngoại lệ.
@throw Tung ra một ngoại lệ.
@catch Bắt (khối lệnh được thực thi nếu ngoại lệ phát sinh) ngoại lệ bên trong khối mã lệnh @try ngay trước nó.
@finally Một khối mã lệnh sẽ được thực thi không cần biết có ngoại lệ xảy ra trong @try hay không.

Các Directive sử dụng cho từng mục đích cụ thể.
Directive Definition
@class Khai báo tên của một lớp được định nghĩa ở đâu đó.
@selector(method_name) Trả về selector đã được biên dịch xác định phương thức có tên là tham số trong dấu ngoặc.
@protocol(protocol_name) Trả về protocol( thực thể của một Protocol class) có tên trong dấu ngoặc. @protocol(không có tham số) cũng hợp lệ khi khai báo chuyển tiếp(forward declarations).
@encode(type_spec) Cho ta chuỗi đã được encode của tham số type_spec.
@”string” Định nghĩa một hằng chuỗi NSString object và khởi tạo chuỗi với 7-bit chuẩn ASCII-encoded.
@”string1″ @”string2″ …
@”stringN” Định nghĩa một hằng chuỗi NSString object. Chuỗi được tạo ra là kết quả của việc nối các chuỗi xác định trong các directives.
@synchronized() Định nghĩa một khối mã lệnh mà chỉ được chạy (execute) bằng một thread tại mỗi thời điểm.

Một số từ khóa riêng của Objective C
in out inout bycopy
byref oneway

Những từ khóa sử dụng cho mục đích quản lý bộ nhớ trong Objective-C

Chúng được gọi là từ khóa nhưng thực chất là các phương thức trong lớp cha đầu tiên (root class) NSObject.
alloc retain release autorelease

Một số từ khóa khác:

1. bool là từ khóa trong objective-C nhưng giá trị của nó ở đây là YES hoặc NO. Trong C và C++ nó có giá trị là TRUE hoặc FALSE.

2. ‘super’ và ‘self’ có thể gọi là từ khóa, nhưng self là một đối số ẩn của của mỗi phương thức và super chỉ dẫn cho trình biên dịch cách sử dụng mỗi từ khóa self khác nhau.
Các Directives tiền xử lý (Preprocessor Directives)
Các directives tiền xử lý là những thông báo đặc biệt:
Directive Definition
// Sử dụng để khóa một dòng code.
#import Giống như C và C++ nó được sử dụng để include một file nhưng không include nhiều hơn một lần.


Nếu bạn đã từng học lập trình thì chắc chắn bạn biết rằng HelloWold là chương trình kinh điển trong ngành IT :) , bất cứ ngôn ngữ lập trình nào thì HelloWorld cũng là chương trình demo đầu tiên mà bạn viết. Chúng ta cũng sẽ bắt đầu bằng những gì được cho là nên phải bắt đầu từ đó.
Có rất nhiều kiểu để thể hiện một chương trình HelloWorld trên iPhone, mình sẽ chỉ cho các bạn cách đơn giản nhất. Để lập trình iPhone, bạn phải có một số hiểu biết nhất định về ngôn ngữ Objective-C. Apple có cung cấp một số tutorial đơn giản, ngắn gọn về Objective-C. Các bạn có thể xem ở đây.
Nếu bạn chưa cài đặt iPhone SDK trên máy tính của mình, bấm vào đây để tìm hiểu cách cài đặt. Sau khi bạn đã hoàn tất công việc cài đặt, chúng ta cùng tiếp tục.
Tạo ứng dụng Navigation-Based.


Bạn sẽ thao tác với bộ công cụ Xcode để thực hiện mọi công việc trong quá trình phát triển các ứng dụng của mình.
Tạo new iPhone OS Project
Vào Xcode>New Project một cửa sổ mới sẽ xuất hiện như hình dưới
Bạn phải chọn Application bên dưới iPhone OS và chọn Navigation-Based Application. Bấm Choose… và bạn sẽ được yêu cầu đặt tên cho project. Gõ vào “HelloWorld” và ta cùng bắt đầu.
Tìm hiểu về những files mặc định
Bạn có tự hỏi những file gì mà nhiều vậy?
Có khá nhiều file được tự động thêm vào project của bạn. Lần đầu mới nhìn, mình có cảm giác như là đang bị đe dọa. Đừng quá lo lắng, chúng ta chỉ cần chỉnh sửa một file trong số đó. Sau đây mình sẽ giải thích sơ qua về các file khác. Bạn có thể bỏ qua không cần đọc phần này, tuy nhiên lần đầu tiên khi thấy nhiều file như vậy khi lập trình iPhone, mình cảm thấy khá bối rối.
1. CoreGraphics.framework, Foundation.framework, UIKit.framework- Chắc bạn đã đoán được, đây là môt tập hợp các library functions cung cấp sẵn bởi Apple mà chúng ta sẽ sử dụng trong các ứng dụng của mình. Chúng ta sử dụng chúng giống như việc include thư viện trong các ngôn ngữ lập trình khác.
2. HelloWorld.app – Đây chính là ứng dụng của bạn được cài đặt vào iPhone. Ngay lúc này, chúng ta chưa thật sự cần quan tâm đến nó.
3. Hello_World_Prefix.pch – Đây là một file được include khác, biên dịch từ nhiều file riêng biệt giúp bạn không cần phải include từng file một vào trong project. File này chứa một số đoạn mã để include dữ liệu bên trong frameworks.
4. Hello_WorldAppDelegate.h – Đây là file header chứa tất cả các định nghĩa về biến mà ta sẽ sử dụng. Tương tự như một file header trong C hay C++.
5. Hello_WorldAppDelegate.m – Phần cốt lõi của ứng dụng nằm ở đây. File chính là điểm bắt đầu của ứng dụng. File main.m gọi object này.
6. Info.plist – file này chứa nhiều thông tin(meta information) khác nhau trong chương trình của bạn. Bạn sẽ không cần phải động chạm đến file này cho đến khi bạn sẵn sàng cho việc test thử chương trình trên iPhone.
7. main.m – Giống như hầu hết các ngôn ngữ lập trình khác, file này chứa hàm main. Đây là khởi điểm của chương trình. Hàm main về cơ bản khởi tạo object và khởi động chương trình. Bạn không phải chỉnh sửa file này.
8. MainWindow.xib – Chứa các thông tin trực quan về cửa sổ màn hình chính(main window). Nếu bạn nháy đúp lên nó, một chương trình có tên gọi “Interface Builder” sẽ được được mở ra.Chúng ta sẽ nói đến “Interface Builder” sau. Bạn cần nhớ một điều, file này không chứa bất kỳ một dòng mã nào cả.
9. RootViewController.h, RootViewController.m – Những file này dùng cho một view controller đã được thêm sẵn vào cửa sổ màn hình chính(main window). Về cơ bản, Apple đã tạo sẵn một giao diện đơn giản ngay khi bạn bấm vào Navigation-Based Application. Vì hầu hết các ứng dụng kiểu navigation-based đều sử dụng một TableView, Apple cung cấp sẵn cho chúng ta.
10. RootViewController.xib – Đây là một view mà Apple cung cấp sẵn dưới dạng table. Nó có các dòng và cột. Chúng ta sẽ hiển thị lời chào “HelloWorld” trên một trong số các dòng của table này.
Tất cả các file trên tập hợp lại để tạo nên một chương trình cơ bản. Nào, bạn hãy bấm vào nút Build and Go ở phía trên của Xcode. Chú ý cái drop-down phía trên bên trái hiển thị Simulator|Debug, có nghĩa là bạn bảo Xcode rằng bạn đang test trên thiết bị giả lập iPhone(iPhone Simulator).
Cập nhật UITableView Cells để hiển thị lời chào “HelloWorld”.
Bây giờ chúng ta sẽ code tý chút
Ta bắt đầu bằng việc mở file RootViewController.m. Đây là view controller mà Apple đã thêm sẵn vào cửa sổ chính của chương trình. Tất cả các hàm mà bạn thấy đã được tạo sẵn ở đây được overridden từ lớp cha TableView. Vì chúng ta đang chỉnh sửa table nên các hàm này liên quan đến thao tác chỉnh sửa table. Tìm hàm numberOfRowsInSection.
-(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section{
return 0;
}
Hàm này cho ứng dụng biết table sẽ chứa bao nhiêu dòng. Hiện tại nó trả về 0. Chúng ta sẽ sửa lại thành return 1. Ta muốn ứng dụng sẽ hiển thị 1 dòng trên table. Bây giờ, kéo xuống hàm cellForRowAtIndexPath. Hàm này được gọi một lần đối với mỗi dòng. Đây là nơi ta sẽ định nghĩa những gì sẽ được hiển thị tại từng dòng. Trong trường hợp này ta muốn hiển thị lời chào “Hello World”.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *MyIdentifier = @”MyIdentifier”;

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];
}
// Set up the cell
return cell;
}
Những gì mà hàm này đang làm là tạo ra một đối tượng cell và return đối tượng này. Đoạn mã trong khối if(cell==nil) kiểm tra xem chúng ta đã tạo ra một cell trước đó chưa. Nếu chưa, tạo một cell mới, còn không thì sử dụng cell đã tạo trước đó. Việc này giúp cho ứng dụng có performance tốt hơn vì ta không phải tạo ra cell mới mỗi lần chương trình gọi lại hàm này. Bạn thêm dòng code sau vào ngay trước dòng chú thích // Set up the cell:
[cell setText:@”Hello World”];
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *MyIdentifier = @”MyIdentifier”;

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];
}

[cell setText:@"Hello World"];


// Set up the cell
return cell;
}
Ta gọi phương thức setText của đối tượng cell và truyền vào chuỗi “Hello World”. Bạn biết rằng trong Objective-C, chuỗi bắt đầu với ký tự “@”. Bây giờ bấm nút Build and Go để khởi động iPhone Simulator. Bạn sẽ thấy một màn hình như dưới đây: