Đoán tại sao bạn có thể bị nhầm lẫn, tôi muốn thêm giải thích về mẫu mã thứ hai thực sự làm gì (và tại sao nó không cần thiết).
NSMutableDictionary *foo = [[NSMutableDictionary alloc] initWithCapacity:0];
Tôi nghĩ bạn đang bị nhầm lẫn bởi dòng này vì dòng này thường được mô tả là "khởi tạo foo". Đó là một chút sai lầm. Có 2 thực thể khác nhau về mặt kỹ thuật được thay đổi ở đây - đối tượng NSMutableDictionary
mới được tạo và biến "foo" được gán địa chỉ của nó.
Dòng thực sự tạo đối tượng NSMutableDictionary
mới trên vùng heap (vùng nhớ động của ứng dụng). Tôi sẽ gọi đây là "Từ điển 1". Vì vậy, đối tượng "Từ điển 1" mới này trên heap có thể được tìm thấy, địa chỉ bộ nhớ của nó được lưu trữ trong "foo". Vai trò của "foo" là hoạt động như một chỉ mục, vì vậy chúng tôi có thể tìm thấy "Từ điển 1".
Trong khi chúng ta thường nói: "foo là từ điển", đó là vì chúng ta lười biếng - tuyên bố về mặt kỹ thuật là sai. Chính xác: "có một từ điển trên heap và foo lưu trữ địa chỉ bộ nhớ của nó để chúng ta có thể tìm thấy nó và sử dụng nó".
Khi bạn sau đó chạy dòng:
foo = [bar mutableCopy];
bạn đang sử dụng địa chỉ trong "thanh" để tìm một đối tượng khác nhau (tôi sẽ gọi nó là "từ điển 2") trong heap, và làm chưa một đối tượng khác ("Từ điển 3") trên heap có cùng giá trị. Nếu bạn đang đếm, bây giờ là 3 đối tượng tồn tại.
Sau khi "Từ điển 3" được thực hiện, địa chỉ bộ nhớ của nó sau đó được lưu trữ trong biến "foo". Việc lưu trữ này vào "foo" sẽ ghi đè địa chỉ bộ nhớ hiện tại (địa chỉ được trỏ tới "Từ điển 1"). Điều này có nghĩa là chúng tôi không còn con trỏ đến "Từ điển 1" và do đó sẽ không bao giờ có thể tìm lại được nữa. Đây là lý do tại sao chúng tôi nói "Từ điển 1" đã bị rò rỉ.
Tôi hy vọng bạn có thể thấy từ tình huống này tại sao "Từ điển 1" không bao giờ cần thiết (bạn chỉ có ý định sử dụng "foo" để truy cập bản sao "Từ điển 3").
Nguồn
2009-03-23 00:16:02
Không phát hành. mutableCopy trả về một đối tượng autoreleased. – NilObject
từ tài liệu: Người invoker của phương thức, tuy nhiên, chịu trách nhiệm giải phóng đối tượng được trả về. – cobbal
@NilObject: Không, không. Xem http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmObjectOwnership.html#//apple_ref/doc/uid/20000043-BEHDEDDB –