2012-01-21 29 views
5

Tôi mới sử dụng iOS 5 và ARC, vì vậy hãy tha thứ cho câu hỏi ngớ ngẩn của tôi.Tác động của tính năng tham chiếu tự động (ARC) trên bộ nhớ rò rỉ

Nếu chúng tôi sử dụng ARC trong dự án của chúng tôi, điều đó có nghĩa là sẽ không có bất kỳ rò rỉ bộ nhớ nào cả.

Có cần sử dụng Thiết bị để phát hiện rò rỉ bộ nhớ và NSZombies nếu chúng tôi sử dụng ARC không?

+0

Không, ARC sẽ không xóa hoàn toàn rò rỉ bộ nhớ. Xem [Loại rò rỉ nào tính toán tham chiếu tự động của Objective-C (trong Xcode 4.2) không ngăn ngừa/giảm thiểu?] (Http://stackoverflow.com/questions/6260256/what-kind-of-leaks-does-objective-cs -automatic-reference-counting-in-xcode-4-2) – BoltClock

Trả lời

5

ARC sẽ giúp bạn loại bỏ một số loại rò rỉ nhất định, vì bạn sẽ không quên release hoặc autorelease các đối tượng duy nhất. Ví dụ: loại lỗi này trở thành không thể:

myLabel.text = [[NSString alloc] initWithFormat:@"%d", 17]; 
// oops, just leaked that NSString! 

Tuy nhiên, ARC sẽ không loại bỏ rò rỉ do chu kỳ lưu giữ. Nó vẫn tùy thuộc vào bạn để loại bỏ các chu kỳ giữ lại, hoặc bằng cách sử dụng các tham chiếu yếu hoặc bằng cách phá vỡ các chu kỳ trước khi chúng bị rò rỉ. Ví dụ, khi chúng ta bắt đầu sử dụng khối nhiều hơn, khối/tự giữ lại chu kỳ trở nên phổ biến hơn nhiều. Các Transitioning to ARC Release Notes thảo luận làm thế nào để tránh những chu kỳ sử dụng tài liệu tham khảo yếu.

+1

Nếu bạn muốn hiểu ARC, tôi khuyên bạn nên giới thiệu video "Giới thiệu tính năng tham chiếu tự động" từ [WWDC 2011] (https://developer.apple.com/videos/wwdc/2011/). –

+0

Tôi có thể làm gì trong một tình huống như câu hỏi này http://stackoverflow.com/questions/21423309/memory-leak-in-nsstring-stringwithutf8string-with-arc-enabled – deltaaruna

0

Không, điều đó không ngăn không cho rò rỉ bộ nhớ xảy ra. Điều gì xảy ra trong runtimes với đếm tham chiếu, là đôi khi mã của bạn để lại tham chiếu lủng lẳng, và sau đó các đối tượng không được giải phóng. Nó vẫn còn tùy thuộc vào bạn để viết mã tốt.

+0

Ok. Vậy điều tương tự cũng sẽ áp dụng cho NSZombies? – meetpd

0

Nếu chúng tôi sử dụng ARC trong dự án của mình, điều đó có nghĩa là sẽ không có bất kỳ rò rỉ bộ nhớ nào.

Có thể vẫn còn rò rỉ - Trong chương trình của bạn và trong các thư viện bạn sử dụng. Đồng thời, ARC chỉ áp dụng cho các đối tượng ObjC - bạn có thể dễ dàng rò rỉ bất kỳ phân bổ đống nào không phải là một đối tượng objc (ví dụ: malloc/new).

Có cần sử dụng Thiết bị để phát hiện rò rỉ bộ nhớ và NSZombies nếu chúng tôi sử dụng ARC không?

Có. Câu trả lời trước đó nên nêu chi tiết lý do tại sao chương trình của bạn không được đảm bảo không có các vấn đề này. Ngoài ra, trình biên dịch có thể làm cho nó sai nếu bạn làm những điều ngớ ngẩn, và bạn chắc chắn có thể gây ra vấn đề nếu không bảo vệ dữ liệu của bạn đúng cách (ví dụ như thực thi đồng thời).

Các vấn đề liên quan