2010-06-15 40 views
5

Có cách nào dễ dàng để có các thùng chứa mục tiêu tinh khiết-c, chẳng hạn như NSMutableDictionary hoặc CFMutableDictionary, không tăng số lượng tham chiếu của đối tượng được thêm vào mà không sử dụng tiêu chuẩn C++ thư viện?từ điển không đếm tham chiếu trong mục tiêu-c

EDIT: Giải thích - lý do tôi muốn điều này là vì vậy tôi có thể triển khai một loại mẫu "Chính xác Một" - một lớp sẽ có phương thức getThing tĩnh: (NSString *). Nếu phương thức đó tìm thấy Thing được kết hợp với tên trong một số cơ sở dữ liệu tĩnh (từ điển không tham chiếu), nó trả về nó, nếu không nó sẽ tạo một, thêm nó vào cấu trúc dưới tên đó và trả về nó. Đối tượng Thing đó có thể được giữ lại bởi máy khách theo ý muốn, nhưng khi số tham chiếu của nó rơi xuống 0 (và dealloc được gọi), nó phải được loại bỏ khỏi từ điển. Vì vậy, tôi không thể phát hành nó khi thêm và giữ lại nó khi loại bỏ nó - dealloc sẽ được gọi lại, và tôi không muốn điều đó. Đó là lý do tại sao tôi cần từ điển không tăng dần. Nếu có một cách khác để có được những gì tôi muốn, xin vui lòng cho tôi biết, mặc dù tôi khá chắc chắn rằng câu trả lời đã kiểm tra mang lại cho tôi những gì tôi muốn. Cảm ơn!

Trả lời

3

Nếu bạn đang phát triển cho MacOSX, thì bạn có thể sử dụng NSMapTable. Xem này blog post from Mike Ash để tìm hiểu thêm về nó.

Nếu bạn đang phát triển cho iPhone, sau đó bạn có thể sử dụng CFMutableDictionary với một cấu trúc gọi lại tùy chỉnh:

  • sao chép cấu trúc kCFTypeDictionaryKeyCallBackskCFTypeDictionaryValueCallBacks vào những cái mới.
  • đặt các trường retainrelease thành NULL nơi bạn không cần giữ lại/giải phóng (khóa và/hoặc giá trị).
  • chuyển các cấu trúc khi gọi CFDictionaryCreateMutable.

Bằng cách này, bạn sẽ có một từ điển không giữ lại hoặc không phát hành.

1

Tại sao bạn cần hộp chứa đếm không tham chiếu? Nếu bạn đang lưu trữ các giá trị thông thường (như số nguyên), bạn có thể bọc chúng theo loại NSValue và nếu bạn có một số loại khác, nhưng bạn không muốn có nhiều số tham chiếu, chỉ cần gọi "giải phóng" nó ngay lập tức sau khi bạn thêm nó vào thùng chứa.

+1

Sự cố khi gọi 'release' sau khi thêm là vùng chứa sẽ giải phóng đối tượng khi nó bị xóa, vì vậy nếu bạn không giữ con trỏ đến nó mà bạn có thể giữ lại trước khi xóa, bạn sẽ gió lên phát hành nó. – warrenm

+0

@warrenm, nhưng bạn hoàn toàn có thể gọi giữ lại trước khi xóa đối tượng ... tất nhiên, tôi không thấy lý do tại sao bạn không muốn tăng số lượng tham chiếu khi thêm ở vị trí đầu tiên. –

+0

Điểm tốt. Điều đó hoàn toàn vô hiệu hóa bình luận của tôi. Xin lỗi vì điều đó. – warrenm

1

Bạn có thể tạo một NSValue đại diện cho từng đối tượng bằng phương pháp valueWithPointer:. Việc thêm các giá trị vào bộ sưu tập thay vào đó sẽ không giữ lại đối tượng được tham chiếu. Điều này là khá thô, vì vậy hãy xem xét nếu có thể không có một cách tốt hơn để đạt được mục tiêu của bạn hơn là sidestepping quyền sở hữu container của các đối tượng chứa.

0

Nếu trên Mac OS X, hãy sử dụng NSMapTable.

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