Automatic Reference Counting (ARC) trong Xcode 4.2

I. Thông tin chung:

Xcode 4.2 ra đời với tính năng mạnh mẽ Automatic Reference Counting (ARC) giúp đỡ lập trình viên tập trung hơn vào việc tạo ra các phần mềm tuyệt vời hơn thay vì cứ phải tập trung vào việc làm sao để bộ nhớ không bị quá tải (Memory leak). Bản thân tôi (huygamer) lúc trước luôn ghét phải release bộ nhớ mỗi khi làm việc với các ngôn ngữ C, C++ (học lại 1 lần cái này >.<). Đây chính là thứ giúp tôi thoát khỏi cơn ác mộng của việc quản lý bộ nhớ.

Mặc dù vậy, do không hiểu rõ vấn đề mà rất nhiều lập trình viên trong các công ty lớn hàng trăm người vẫn chưa sử dụng công nghệ mới ARC trong chương trình của họ. Đây là điểm tụt hậu của Việt Nam so với thế giới.

II. Nội dung chính:
1. Định nghĩa chung:
ARC chính là một phương pháp quản lý bộ nhớ trước lúc thực thi chương trình (compile time). Nó không phải chỉ thêm một lệnh vào trong chương trình đang chạy của bạn mà nó đã đưa lệnh vào từ trước khi bạn build chương trình để chạy. Với ARC, trình biên dịch (LLVM v3.0) tự động thêm vào những lệnh retain và release vào trong đối tượng của bạn và quyết định khi nào đối tượng đó không còn được sử dụng nữa. Chỉ khi nào có con trỏ (point) trỏ đến đối tượng thì đối tượng đó mới tiếp tục tồn tại trong chương trình nếu không nó sẽ bị tự động xóa khỏi bộ nhớ. Sau khi ARC thêm vào các lệnh để quản lý bộ nhớ, chương trình mới được triển khai.

NSObject *obj = [[NSObject alloc] init];

// Các mã lệnh của bạn

Sau khi được compile với ARC nó sẽ là:
NSObject *obj = [[NSObject alloc] init];

// Các mã lệnh của bạn

[obj release]; // *****ARC thêm vào

Đây là biểu đồ từ tài liệu chính thức của Apple cho chúng ta thấy quá trình làm việc của ARC. Nó cho thấy việc sử dụng retain/release trở nên hoàn toàn vô nghĩa. Nó mang lại phong cách lập trình hoàn toàn mới cho các lập trình viên: nhanh hơn, chuẩn hơn và không phát sinh lỗi do quản lý bộ nhớ.

Biểu đồ cho thấy, thời gian phát triển phần mềm được rút ngắn đáng kế. Đó là chưa tính đến việc phải kiểm tra những lỗi do quản lý bộ nhớ thủ công tạo ra. Những phần quản lý bộ nhớ đã được sinh ra hoàn toàn tự động.

* Tác dụng:
Nếu không có ARC, những dòng code sau đây sẽ tạo ra sự rò rỉ bộ nhớ vì những dữ liệu được trả về sẽ không bao giờ được giải phóng và cũng không có con trỏ nào chỉ vào nó:

– (NSString *) lkPlayerInfo{
return [[NSString alloc] initWithFormat:@”%@, %@ @%”, self.lkNickName, self.lkTitle, self.LKCapDo];
}

Với ARC, nó tự động thêm vào những lệnh giải phóng trong lúc thực thi chương trình để khắc phục sự rò rỉ về bộ nhớ này.

2. Những điểm cần lưu ý khi dùng ARC:
a. Đơn giản hóa việc tạo đối tượng:
– Một khi sử dụng ARC, bạn không thể sử dụng các lệnh retain, retainCount, release, hay autorelease trong mã nguồn vì những lệnh này được ARC thêm vào tự động trước khi chương trình được chạy. Bạn cũng không thể nào override hay implement những lệnh này.

– Bạn cũng không thể sử dụng các selector trỏ vào nó như thế này: @selector(retain) và @selector(release)

* Lưu ý: Một khi đã không cần sử dụng thì cũng đâu cần phải quản lý nó nữa. Nó không phải là vấn để gì lớn nhưng có thể theo thói quen của những lập trình viên thế hệ cũ mà họ vẫn đánh những dòng code này vào.

b. Dealloc Method:
– Nhờ vào ARC bạn cũng không cần phải implement hàm dealloc trong các lớp đối tượng (Class) vì với ARC, các đối tượng luôn được giải phóng tự động. Bạn không cần phải tạo lệnh dealloc trực tiếp. Tuy nhiên, bạn hoàn toàn có thể tạo những dealloc method tùy chỉnh để có thể giải phóng các biến trong chương trình.
c. Con trỏ đối tượng trong Object C:
– Bạn không thể tạo các cấu trúc nữa. Thay vào đó, bạn có thể tùy chỉnh lại các lớp phụ (subclasses) trong Objective C.

* Lưu ý: Tuy nhiên nếu vẫn cần đến những lớp có stuct như trong C, chúng ta vẫn có thể tạm thời tắt chức năng ARC trong một số file để có thể chạy chương trình bình thường.
d. Ép kiểu sử dụng bridge:
– Bạn không thể nào ép kiểu theo cách bình thường được nữa:
NSString *LKStringX = (NSString *) LKStringY;
Thay vào đó bạn có thể dụng chỉ thị _bridge:
NSString *LKStringX = (_bridge NSString *) LKStringY;

* Lý do cho việc này: Hệ thống cần biết những đối tượng chỉ tạo ra trong tức thời (không có con trỏ chỉ vào) để nó không tự động giải phóng ngay lập tức
e. Sử dụng @autorelease thay thế Pool
– NSAutoreleasePool không còn nhưng bạn vẫn có thể sử dụng @autoreleasepool

int main(int argc, char *argv[])

{

@autoreleasepool {

return UIApplicationMain(argc, argv, nil, NSStringFromClass([ExampleAppDelegate class]));

  }

}

f. Một điểm lưu ý thêm:

– Do việc quản lý bộ nhớ đã không còn nữa nên bạn không thể dùng NSAllocateObject hay NSDeallocateObject (mà nghĩ lại cũng không biết dùng để làm gì khi bộ nhớ được quản lý tự động)

* Lưu ý:
– Ngoài ra, Xcode cung cấp sẵn công cụ để bạn có thê chuyển các chương trình chưa sử dụng ARC (non-ARC) thành những chương trình có ARC.

III. Kết luận:
– ARC là một tính năng cực hay của Xcode 4.2 trở lên. Nó không chỉ giúp lập trình viên làm việc dễ dàng hơn (không cần biết đến việc quản lý bộ nhớ) mà nó còn giúp cho bạn tránh được những lỗi không đáng có. ARC giúp bạn tập trung vào những tính năng của chương trình hơn là cứ phải chăm chăm vào những thứ không đáng. Hãy sử dụng những công nghệ mới đừng chăm chăm vào những thứ cũ kĩ mà phung phí thời gian làm những cái mà lẽ ra máy làm rồi.
– Trừ phi bạn là những lập trình viên quá yếu kém không thể tự chính sửa những đoạn code theo chuẩn mới, nếu không hãy sử dụng ARC để tăng tốc và làm cho chính bạn thoải mái hơn.
– Nó là một công cụ tuyệt vời cho những người mới bước chân vào lập trình IOS. Bạn sẽ tiết kiệm rất nhiều công sức để có thể viết chương trình.

Tagged: , , , , , , , , , , ,

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: