+2

Quản lý bộ nhớ trong Objective - C

1. Vấn đề về quản lý bộ nhớ trong iOS

Mọi đối tượng được tạo ra trong iOS đều cần phải được quản lý một cách chặt chẽ. Từ lúc được khởi tạo trong bộ nhớ, sử dụng trong quá trình ứng dụng hoạt động, đến lúc mất đi đều phải được kiểm soát. Nhằm tránh việc chúng ta không kiểm soát được sự tồn tại của nó, đẫn đến rò rỉ bộ nhớ.

Bản chất của thiết bị di động là bộ nhớ RAM khả dụng rất ít, nếu rò rỉ bộ nhớ rất dễ tràn bộ nhớ, gây nên hiện tượng chết đột ngột ứng dụng.

2. Đôi chút về một đối tượng trong iOS

Một vùng nhớ khi được khởi tạo trong bộ nhớ thì muốn tồn tại được nhất thiết phải có một đối tượng trỏ (tham chiếu) đến nó. Trong iOS gọi những tham chiếu này là object ownership,. Một vùng nhớ có thể có nhiều tham chiếu đến nó. Khi có một tham chiếu đối tượng thì refrence count sẽ tăng thêm một, khi bỏ 1 object owership thì reference count sẽ giảm đi một. Khi mà reference count của một đối tượng lớn hơn 0 thì nó sẽ vẫn tồn tại, chỉ khi nào về 0 thì đối tượng đó mới bị xoá khỏi vùng nhớ.

reference-counting.png

Lúc ban đầu, Objective - C quản lý bộ nhớ, quản lý vòng đời của các đối tượng một cách thủ công, bằng cách gọi các method mặc định của - NSObject protocol, gọi là Manual Retain-Release (MRR). Đến tận phiên bản iOS 5.0 trở đi, dùng Xcode 4.2, Apple giới thiệu một cách mới để quản lý bộ nhớ một cách đơn giản hơn, tiện lợi, và giảm thiểu mức độ rủi ro của phương pháp thủ công lúc trước mang lại, gọi là Automatic Reference Counting (ARC).

3. Manual Retain - Release (MRR)

Ở môi trường này, bạn phải quản lý mọi hoạt động của một đối tượng. Thành lập một ownership đến đối tượng để sử dụng nó và remove đi khi không sử dụng nó nữa, một cách hoàn toàn thủ công. Apple cung cấp một số method để chúng ta thực hiện điều này

alloc Khởi tạo một đối tượng và yêu cầu quyền sở hữu đối tượng đó

retain Tăng retain count của đối tượng lên một, gửi giữ một ownership đến một đối tượng đã tồn tại

copy Copy một đối tượng ra một một vùng mới và giữ một ownership đến nó

release Giảm retain count của đối tượng đi 1

autorelease Giảm retain count của đối tượng đi 1 nhưng không lập tức. Chỉ khi ra khỏi phạm vi gọi method này thì mới có tác dụng

Có hai vấn đề thường xảy ra trong quá trình quản lý một đối tượng một cách manual.

  1. Khi dùng xong một đối tượng mà quên không release nó đi thì sẽ dẫn đến là nó sẽ không được xoá trong bộ nhớ, dẫn đến rò rỉ bộ nhớ, memory leak. Bình thường vấn đề này cũng không lớn, nó chỉ trở nên nghiêm trọng khi chúng ta dùng hết bộ nhớ, chương trình sẽ bị crash.
  2. Khi chúng ta release một đối tượng quá nhiều lần, cũng sẽ dẫn đến tình trạng dangling pointer. Một con trỏ không tồn tại, và khi nó đã không tồn tại, mà chúng ta cố gắng truy cập đến nó thì tất nhiên sẽ crash program.

Với những sự bất tiện và dễ nhầm lẫn dễ quên như thế, Apple cho ra đời một hệ thống mà ở đó các developer không cần phải quan tâm đến việc việc sống còn của một đối tượng. Đó là Automatic Reference Counting, viết tắt là ARC.

4. Automatic Reference Counting (ARC)

ARC sẽ giúp chúng ta những việc như bên MRR. Nó sẽ tự động chèn các message retain và release vào có hàm setter và getter của đối tượng đóđó, hoặc trong thân một method, nếu khai báo một đối tượng trong method đó thì sẽ tự động chèn message release trước khi ra khỏi method đó.

ARC cũng giới thiệu đến với chúng ta những attributes của một @property đó là strong và weak.

strong: Khi một property là kiểu strong thì nó sẽ tham chiếu mạnh đến đối tượng khác, nó sở hữu đối tượng đó, nghĩa là nó sẽ có liên quan đến sự tồn tại của đối tượng.

weak: Khi một property là kiểu weak thì nó sẽ tham chiếu yếu đến đối tượng khác. Nó chỉ tham chiếu đến đối tượng, không trực tiếp sở hữu đối tượng trỏ đến. Không tăng retain count, khi đối tượng bị remove khỏi bộ nhớ thì nó tự động bị set bằng nil.

Các vấn đề strong, weak, ý nghĩa và tác dụng cụ thể của nó sẽ được trình bày vào một dịp khác.

Xin cảm ơn các bạn đã đọc bài viết của mình.

Bài viết trên được viết từ kiến thức bản thân và có sự tham khảo từ các website:

http://rypress.com/tutorials/objective-c/memory-management

https://en.wikipedia.org/wiki/Automatic_Reference_Counting#Property_declarations


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.