Xử lý Memory Leaks trong ứng dụng iOS : Phần 1 – Một số kinh nghiệm truy vết


Memory Leaks đã từng là nỗi ám ảnh của rất nhiều lập trình viên iOS, thậm chí cả những lập trình viên nhiều kinh nghiệm trước khi Apple hổ trợ tính năng ARC (Automatic Reference Counting) trong trình biên dịch Objective C.

Thuật ngữ memory leaks chỉ những vấn đề liên quan đến memory của ứng dụng, bao gồm việc memory không ngừng tăng trong quá trình sử dụng ứng dụng còn gọi làunbounded growth memory, hoặc có những vùng nhớ tồn tại nhưng không hề có một tham chiếu nào đến nó và không bao giờ bị hủy.  Ngoài hai vấn đề này, tôi cũng sẽ nói đến lỗi phổ biến EXC_BAD_ACCESS trong ứng dụng iOS và một số kinh nghiệm fix lỗi này.

Trước tiên,  tôi muốn trình bày một số kinh nghiệm để phòng tránh memory leaks. Nếu bạn đang không sử dụng trình biên dịch hổ trợ ARC trong dự án của bạn, do yêu cầu hoặc do bạn phải maintain một dự án trước đó không sử dụng ARC, cho dù là do cái gì thì bạn đang có nguy cơ gặp memory leaks, do vậy hãy ghi nhớ thật kỷ 4 điều sau:

  • Đừng bao giờ sử dụng autorelease nếu bạn biết có thể release đối tượng mà bạn đã tạo ra.
  • Chỉ release đối tượng khi chính bạn là người tạo ra đối tượng đó bằng việc sử dụng các hàm: alloc, retain, archive, unarchive.
  • Luôn luôn code cặp lệnh alloc và release liền nhau , sau đó chèn những mã lệnh khác vào giữa cặp lệnh đó. Kết quả của style coding này là bắt đầu mỗi phương thức của bạn luôn là mã lệnh khởi tạo (alloc) đối tượng, và kết thúc mỗi phương thức luôn là mã lệnh release đối tượng. Do vậy bạn sẽ không bao giờ sót việc gọi release một đối tượng do chính bạn tạo ra.
  • Hãy suy nghĩ cẩn thận trước khi bạn retain một đối tượng, và luôn luôn có 1 dòng comment kèm theo ghi chú nơi mà đối tượng đó sẽ bị release hoàn toàn.

Sau 4 điều này, bạn phải luôn luôn chạy Build and Analyze trước Run ứng dụng trên Simulator,  Xcode sẽ phân tích toàn bộ source của bạn, và sẽ báo những dòng code có khả năng gây ra leak memory, hoặc những đối tượng được tạo ra mà không sử dụng, hoặc không được release.

Đến đây xem như bạn đã giảm được một nữa nguy cơ gặp leak memory. Một nữa còn lại, là lúc bạn phải chập nhận tìm và truy vết nó. Một công cụ hữu dụng giúp bạn trong trường hợp này là Leak Instrument tool, hãy vào menu tool Run\Run with Performance Tool\Leaks. Công cụ này sẽ khởi chạy ứng dụng của bạn, qua đó đo các thông số về kích thước vùng nhớ được tạo ra, vùng nhớ nào bị leak, và dòng code nào đã gây ra leak vùng nhớ đó,  thậm chí bạn có thể double-click để đi đến đoạn code đó và fix nó.

Tôi sẽ giới thiệu chi tiết về Instrument  tool ở phần 2 của bài viết này.

Một vấn đề khác liên quan đến memory là crash ứng dụng,  lỗi thường gặp là EXC_BAD_ACCESS,lỗi này là do một đối tượng trỏ đến một vùng nhớ đã bị hủy trước đó, bạn thường chỉ thấy được thông điệp hậu quả chung chung nếu bạn đang debug ứng dụng với Xcode IDE, và sẽ không biệt cụ thể dòng code nào, đối tượng nào đang truy cập vùng nhớ bị hủy. Để thấy được những thông tin đó, bạn cần set tham số NSZombieEnabled = YES trong project settings như hình bên dưới đây

https://i0.wp.com/42games.net/wp-content/uploads/2011/03/Screen-Shot-2011-03-25-at-2.55.48-PM.png

Thiết lập này sẽ giúp bạn thấy được những thông báo cụ thể hơn trong debug console của Xcode IDE về đối tượng truy cập và hàm nào đang gọi khi gặp lỗi EXC_BAD_ACCESS.

Có một số trường hợp, thông số thiết lập này không giúp đưa ra thông tin cụ thể nào cả, ngoài việc thông báo lỗi EXC_BAD_ACCESS, đây là lúc bạn phải thực hiện khoanh vùng và xác định đoạn code đã gây ra lỗi đó, bằng cách comment từng phần cho đến khi nào ứng dụng của bạn hoạt động lại một cách bình thường, như vậy bạn sẽ xác định được đoạn code gây ra lỗi sẽ nằm đâu đó trong phần code đã bị comment lại.

Trong phần 2, tôi sẽ giới thiệu cách sử dụng Instrument tool để xác định vùng nhớ bị leak và cách fix leak memory.  Hẹn gặp lại bạn trong phần 2 của bài viết này.

Advertisements

Về haipro912
Đời rất dở nhưng anh vẫn phải niềm nở =))

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất /  Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Đăng xuất /  Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất /  Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất /  Thay đổi )

Connecting to %s

%d bloggers like this: