2013-02-15 19 views
5

Câu hỏi của tôi là làm thế nào các phiên bản hiện tại của Foundation (hoặc thư viện thời gian chạy Objective-C), vì điều này dường như có) thực hiện giữ lại số đối tượng NSObject có nguồn gốc? Như tôi có thể thấy tại NSObject.mm, không có ngà được gọi là retain count trong cơ thể giao diện của NSObject. Thay vào đó, có vẻ như là một loại bảng hoặc bản đồ có chứa các quầy tham chiếu cho từng đối tượng. Nhưng nếu giữ lại số lượng thực sự được thực hiện với bản đồ, không phải hoạt động retainrelease quá đắt với loại triển khai này (vì trong trường hợp này, cần phải khóa và mở khóa các mutex, tra cứu bản đồ để tìm đúng đối tượng, bên cạnh đó thực tế là, trong một môi trường đa luồng, chỉ một đối tượng có thể được giữ lại/phát hành tại một thời điểm)?Số lượng giữ lại được thực hiện trong NSObject như thế nào?

tôi không tìm thấy bất cứ điều gì liên quan đến thiết lập bộ đếm giữ đến 1 khi phân bổ một đối tượng mới, không phải trong _objc_rootAllocWithZone tại NSObject.mm (mà có vẻ là chức năng mà được gọi bằng [NSObject alloc]) cũng không phải trong _class_createInstanceFromZone tại objc-runtime-new.mm (mà được được gọi sau bởi _objc_rootAllocWithZone).

+2

- (NSUInteger) retainCount {return rand()}; – CodaFi

+0

Ôi trời ơi, tôi đã đặt sai chỗ kết thúc, ... Tôi sẽ không ngủ tối nay. – CodaFi

Trả lời

10

Số lần giữ cho NSObject thực sự được lưu giữ trong bản đồ toàn cầu. IIRC nó thực sự sử dụng một bộ bản đồ được phân vùng, có lẽ dựa trên địa chỉ của đối tượng, để giảm tranh chấp khóa, nhưng các chi tiết thực hiện thực tế chỉ là, chi tiết thực hiện.

Trong mọi trường hợp, bạn không thể tìm thấy mã đặt số người giữ lại thành 1 vì không có bất kỳ số nào. Các đối tượng có số lượng giữ lại là 1 không được đưa vào bản đồ. Các đối tượng chỉ nhập bản đồ đếm số lần giữ lại khi chúng là retain ed qua bước đầu tiên 1. Đây là một tối ưu hóa để tăng tốc độ trường hợp chung của các đối tượng không bao giờ có số lượng giữ lại tăng quá 1.

+1

... với trường hợp đặc biệt của các con trỏ được gắn thẻ không có số lượng giữ lại. Bản thân dữ liệu được mã hóa bên trong con trỏ, vì vậy, bạn sẽ chuyển chúng xung quanh bằng giá trị thay vì tham chiếu (vì tham chiếu là giá trị và không có gì thực sự đằng sau tham chiếu). – Tommy

+0

Đúng. Và tất nhiên, bất kỳ lớp học nào ghi đè lên '-retain' và' -release' đều miễn phí để thực hiện riêng việc đếm số lần giữ lại. Có một số lớp làm nhúng số lượng giữ lại dưới dạng ivar, bởi vì chúng muốn tăng tốc độ 'giữ lại' và' giải phóng' với chi phí có một đối tượng lớn hơn. –

+0

Ok. Nhưng tại sao họ không sử dụng ngà như một bộ đếm, điều này sẽ làm giảm chi phí giữ lại/giải phóng? Bạn có biết liệu có lý do đặc biệt nào để sử dụng bản đồ không? – LuisABOL

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