2013-06-12 29 views
10

nào được coi là cách tốt hơn để lấy được một từ điển mới từ một gốc một:NSDictionary + dictionaryWithDictionary hoặc -copy?

[NSDictionary dictionaryWithDictionary:otherDictionary]; 

hoặc

[otherDictionary copy]; 

?

Thỉnh thoảng chúng ta cần tạo một từ điển có thể thay đổi được từ một từ khóa không thể thay đổi được, và vì vậy câu hỏi này tiếp tục đến. Có lẽ không có, nhưng tôi tò mò muốn xem liệu trong một số trường hợp sử dụng có tốt hơn cai khac.

EDIT: Tôi biết các phương pháp trên không thể được sử dụng để lấy được từ điển có thể thay đổi. Tôi chỉ muốn hỏi câu hỏi một cách tổng quát, và sau đó giải thích cách tôi đối mặt với câu hỏi này từ ngày này sang ngày khác. Tôi nên rõ ràng hơn về điều đó.

Trả lời

27

Thực ra, chúng khác nhau, nhưng không phải vì lý do bạn mong đợi. Tôi sẽ giả sử bạn đang sử dụng ARC (và nếu bạn không, tại sao không?), Vì vậy, tự động phát hành của đối tượng trả về không quan trọng.

Đây là cách chúng khác nhau: xem xét điều gì sẽ xảy ra nếu otherDictionarynil.

Vâng, nếu bạn sử dụng:

[otherDictionary copy]; // or -mutableCopy 

Bạn sẽ liên hệ lại nil, bởi vì bạn có một máy thu nil.

Mặt khác, nếu bạn sử dụng:

[NS(Mutable)Dictionary dictionaryWithDictionary:otherDictionary]; 

Bạn sẽ nhận lại một NS(Mutable)Dictionary, bất kể otherDictionarynil hay không.

này là tốt đẹp trong tình huống mà bạn cần để tạo ra một bản sao của một cuốn từ điển và muốn một NSDictionary dụ sau, nhưng bạn không muốn để kiểm tra nil (yay để giảm độ phức tạp cyclomatic!).

+2

Đó là, thưa ông, một đánh bắt rất tốt. Và, để chỉ ra một lý do thực tế để chọn một trong những khác, bạn sẽ nhận được dấu kiểm. – matehat

+1

Tiêu đề iOS 9.0 đánh dấu đối số cho 'dictionaryWithDictionary:' như (ngầm) '_Nonnull'. Đây có phải chỉ là một sự giám sát hay là Apple nói rằng hành vi trong quá khứ với các đối số 'nil' không nên dựa vào? –

0

Cách Cocoa chấp thuận là để gửi một phương pháp mutableCopy mà trả về một bản sao có thể thay đổi:

NSMutableDictionary *mutableOtherDictionaryCopy = [otherDictionary mutableCopy] 
3

Họ ngữ nghĩa tương đương. Mà một trong những sử dụng là hoàn toàn là một vấn đề của sự lựa chọn. Tôi ủng hộ -copy, chỉ vì nó ngắn hơn và làm cho những gì đang diễn ra rõ ràng hơn.

Nếu bạn cần bản sao có thể thay đổi (như văn bản của bạn cho biết), các dòng bạn đã đăng sẽ không hoạt động. Bạn cần:

[NSMutableDictionary dictionaryWithDictionary:otherDictionary]; 

hoặc tương đương:

[otherDictionary mutableCopy]; 

Về mặt quản lý bộ nhớ, -copy-mutableCopy, trả về một đối tượng với một 1 giữ lại đếm, có nghĩa là bạn cần phải giải phóng chúng khi bạn' thực hiện lại với họ. -dictionaryWithDictionary: trả về một đối tượng tự động phát hành, vì vậy bạn không cần phải giải phóng nó khi bạn đã hoàn thành nó, và cần giữ lại nó nếu bạn muốn giữ nó. Trong những ngày cũ (trước ARC), sự khác biệt này có nghĩa là cách tiếp cận bạn sử dụng có thể phụ thuộc vào nhu cầu quản lý bộ nhớ của bạn (chúng vẫn có thể hoán đổi sau khi giữ lại hoặc giải phóng thêm). Tất nhiên, nếu bạn đang sử dụng ARC, sự khác biệt này không quan trọng với bạn.

+0

Vâng, cảm ơn, vừa mới bắt được (và chỉnh sửa câu trả lời của tôi). –

+0

Vâng, tôi luôn sử dụng 'mutableCopy' (vì nó sẽ không hoạt động nếu không, như bạn nói). Tôi chỉ muốn xây dựng câu hỏi theo một cách tổng quát, không phải đặc biệt cho các dẫn xuất có thể thay đổi được. – matehat

7

Có một vài điều về câu hỏi này:

Thứ nhất, hai là hơi khác nhau:

[NSDictionary dictionaryWithDictionary:otherDictionary]; #1 
[otherDictionary copy];          #2 

# 1 lợi nhuận một đối tượng autoreleased (ví dụ, một với một +0 giữ count); # 2 trả về một đối tượng có số lần giữ lại +1, vì vậy người gọi có trách nhiệm gọi số release tại một số thời điểm.

(Chúng cũng hơi khác nếu otherDictionarynil: # 1 lợi nhuận một từ điển rỗng, trong khi lợi nhuận # 2 nil.)

Tất nhiên, trong câu hỏi của bạn, bạn thực sự có thể thay đổi hỏi về bản.Lưu ý rằng bạn có thể thực hiện một trong hai cách sau:

[NSMutableDictionary dictionaryWithDictionary:otherDictionary]; 
[otherDictionary mutableCopy]; 

Điều tương tự như trên áp dụng cho từng phương pháp này.

Có thể không phải là cách tốt nhất mỗi lần, nhưng mutableCopy là rõ ràng nhất (chỉ cần nhớ rằng bạn phải giải phóng đối tượng được giữ lại tại một số điểm).

+0

Câu trả lời hay. Vì vậy, với ARC sự lựa chọn hoàn toàn là một câu hỏi về hương vị. – matehat

+0

Câu trả lời hay, nhưng chúng không hoàn toàn giống nhau. Sự khác biệt phát sinh nếu 'otherDictionary' là' nil'. –

+0

@DaveDeLong: Đã ghi chú trong câu trả lời của tôi. – mipadi