2012-04-21 6 views
9

Tôi nhận được ngoại lệ sau khi tìm cách xóa đối tượng khỏi NSMutableDictionary. Mã có liên quan sau. Các 'cài đặt' được chuyển cho phương pháp và có thể là một NSDictionary hoặc một NSMutableDictionary.Xóa đối tượng khỏi từ điển có thể thay đổi sẽ ném ngoại lệ

NSMutableDictionary *mutableSettings = nil; 
if ([settings isKindOfClass:[NSMutableDictionary class]]) 
    mutableSettings = (NSMutableDictionary *)settings; 
else 
    mutableSettings = [[[NSMutableDictionary alloc] initWithDictionary:settings] autorelease]; 

[mutableSettings removeObjectForKey:@"akey"]; 

này bị treo với

* Chấm dứt ứng dụng do ngoại lệ còn tự do 'NSInternalInconsistencyException', lý do: '- [__ NSCFDictionary removeObjectForKey:]: Phương pháp biến đổi gửi đến đối tượng bất biến'

Có vấn đề gì với điều này? Cảm ơn.

Trả lời

10

Vấn đề ở đây là cả hai số NSDictionaryNSMutableDictionary trả lại __NSCFDictionaryclass của họ, do thực tế là NSDictionary là một cụm lớp.

Tôi nghĩ bạn sẽ chỉ phải tạo một bản sao có thể thay đổi của từ điển settings cho dù có thể thay đổi được hay không.

NSMutableDictionary *mutableSettings = [settings mutableCopy]; 
+3

Ngoài ra, như dấu gạch dưới ngụ ý, '__NSCFDictionary' là một lớp riêng tư. Nó không nhất thiết phải là lớp từ điển duy nhất, và nó không được đảm bảo là mãi mãi. Quan trọng hơn, nó là một phân lớp của NSMutableDictionary, vì vậy * mỗi * từ điển (đó là một thể hiện của '__NSCFDictionary') là một loại NSMutableDictionary. Tất cả những điều này có nghĩa là không có cách nào đáng tin cậy để nói liệu một từ điển hay bất kỳ đối tượng plist nào khác — có thể thay đổi được hay không. –