2011-12-29 34 views
20

Tôi đang cố gắng chuyển đổi một đoạn mã Java sử dụng HashMap có chứa như một khóa một đối tượng và một giá trị làm đối tượng.Mục tiêu-C HashMap tương đương

private static HashMap<Class<? extends Component>, ComponentType> componentTypes = new HashMap<Class<? extends Component>, ComponentType>(); 

Tôi đã đọc về cách để làm điều này với obj-C nhưng tôi đã không thành công, hầu hết mọi người đề nghị sử dụng một NSDictionary, vấn đề là họ phím cần phải chuỗi và tôi cần họ như các đối tượng. Các tùy chọn khác là NSMapTable, tuy nhiên nó không có sẵn trên iOS. Ai đó sẽ có thể hỗ trợ làm thế nào tôi có thể chuyển đổi này thành một obj-c tương đương?

cảm ơn,

Trả lời

21

Các phím cho số NSDictionary không cần phải là chuỗi. Chúng có thể là bất kỳ đối tượng nào thực hiện NSCopying. Tuy nhiên, nếu đối tượng là một đối tượng tùy chỉnh, nó cần tạo ra các phản hồi lành mạnh cho các thông báo -hash-isEqual:, nhưng điều này cũng giống như việc sử dụng một đối tượng trong bộ sưu tập Java vì vậy nó không phải là một thách thức lớn.

7

Bạn muốn sử dụng NSDictionary. Bạn nói rằng

họ phím cần phải chuỗi và tôi cần họ như đối tượng

Chìa khóa để một NSDictionary không cần phải dây - họ có thể được bất kỳ đối tượng phù hợp với Giao thức NSCopying.

+2

Điều này là chính xác. Lưu ý rằng có một tình huống phổ biến mà 'NSDictionary' * không * cần các khóa chuỗi: nếu' NSDictionary' được dự kiến ​​sẽ được sử dụng trong Danh sách thuộc tính. –

3

Từ NSDictionary reference

Một cặp khóa-giá trị trong vòng một từ điển được gọi là một mục. Mỗi mục bao gồm một đối tượng đại diện cho khóa và đối tượng thứ hai là giá trị của khóa đó. Trong từ điển, các phím là duy nhất. Tức là, không có hai khóa nào trong một từ điển đơn đều bằng nhau (được xác định bởi isEqual :). Nói chung, một khóa có thể là bất kỳ đối tượng nào (miễn là nó tuân theo giao thức NSCopying - xem bên dưới), nhưng lưu ý rằng khi sử dụng khóa-giá trị mã khóa phải là một chuỗi (xem “Các nguyên tắc cơ bản về mã hóa khóa-giá trị”). Cả khóa lẫn giá trị đều không thể là nil; nếu bạn cần đại diện cho một giá trị null trong một từ điển, bạn nên sử dụng NSNull.

Vì vậy, bất kỳ đối tượng nào đáp ứng giao thức NSCopying đều có thể được sử dụng làm khóa.Hạn chế chuỗi duy nhất là cho Key-Value mã hóa được sử dụng để gán Cocoa

15

Một NSMutableDictionary (giả định rằng bạn cũng cần phải thiết lập các giá trị trong từ điển khi khởi tạo nó) hoạt động theo hai cách:

  1. Là một từ điển truyền thống/hashmap mà bạn thiết lập các giá trị như thế này:

    [myDictionary setObject: theValue forKey: anyObject];

  2. là một đối tượng với thuộc tính KVC tuân thủ điều đó xảy ra được xác định tự động:

    [myDictionary setValue: theValue forKey: aString];

Nếu khóa là một NSString, sau đó hai là hoán đổi cho nhau, với ngoại lệ mà bạn không thể đặt một đối tượng để nil với setObject:forKey:, nhưng bạn có thể vượt qua nil-setValue:forKey:.

1

Tôi phỏng đoán rằng bạn đang sử dụng khóa không tuân thủ Giao thức bản sao của NSCopying. Trong trường hợp đó hãy thử sử dụng Core Foundation tương đương với NSDictionary: CFDictionary.

http://developer.apple.com/library/ios/#documentation/CoreFoundation/Reference/CFDictionaryRef/Reference/reference.html

Chỉ cần chắc chắn rằng khi bạn đang sử dụng CFDictionary rằng tất cả các đối tượng của bạn sẽ được giữ lại trong bộ nhớ trong suốt thời gian của đối tượng. Vì CFDictionary phải được thiết lập với tham chiếu yếu (ít nhất là trong kinh nghiệm của tôi) chỉ cần cẩn thận rằng bạn không vô tình dealloc một trong những đối tượng của bạn whiles nó vẫn còn trong CFDictionary.

Trong khi CFDictionary là "cầu nối miễn phí" với đối tác Quỹ Cocoa, NSDictionary, tôi thấy rằng vẫn còn vấn đề với điều này. Tôi đã cố gắng để thêm các đối tượng mà không phải là một phần của giao thức NSCopying để NSDictionary cầu nối miễn phí của tôi và nó đã đưa ra một lỗi tại thời gian chạy.

docs CFDictionary: http://developer.apple.com/library/ios/#documentation/CoreFoundation/Reference/CFDictionaryRef/Reference/reference.html

Nếu bạn cần mutability, sử dụng CFMutableDictionary thay vì như vậy: cfd = CFDictionaryCreateMutable (NULL, 0, NULL, NULL); CFDictionaryAddValue (cfd, khóa, giá trị); CFRelease (cfd);

CFMutableDictionary tài liệu: http://developer.apple.com/library/ios/#documentation/CoreFoundation/Reference/CFMutableDictionaryRef/Reference/reference.html#//apple_ref/doc/uid/20001497

+0

Xin chào, Cảm ơn tất cả các câu trả lời. Nếu tôi đang sử dụng ARC và tôi sử dụng một CFDictionary, tôi vẫn cần phải xử lý bộ nhớ? – Black20

+0

Nếu bạn sử dụng ARC với CFDictionary, bạn sẽ phải xử lý bộ nhớ trừ khi bạn quyết định sử dụng cầu nối miễn phí. Cá nhân tôi không thể nhận được cầu nối miễn phí hoạt động tốt cho tôi vì nó tiếp tục cố gắng sao chép các đối tượng không phù hợp với NSCopying – bendu

+0

Dưới đây là thông tin thêm về vấn đề cuộn xuống phần trên cầu nối miễn phí http://developer.apple. com/library/ios/releasenotes/ObjectiveC/RN-TransitioningToARC/_index.html # // apple_ref/doc/uid/TP40011226-CH1-DontLinkElementID_5 – bendu

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