2013-02-06 21 views
11

Tôi cố gắng để thêm "datetime" vào từ điển của tôi theo quy định sau:[__NSDictionaryI setObject: forKey:]: chọn không được công nhận gửi đến dụ

Symptom Ranking: { 
    5111ef19253b4a9150000000 = 1; 
    5111f029253b4add4e000000 = 1; 
    5111f036253b4a123d000001 = 1; 
    5111f045253b4a404f000000 = 1; 
} 

NSLog(@"date selected: %@", [[self.datePicker date] description]) 

[self.results setObject:[[self.datePicker date] description] forKey:@"dateTime"]; 

App tai nạn và tôi có được điều này:

Symptom Tracker[43134:c07] -[__NSDictionaryI setObject:forKey:]: unrecognized selector sent to instance 0x7603990 
2013-02-06 08:15:58.741 Symptom Tracker[43134:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSDictionaryI setObject:forKey:]: unrecognized selector sent to instance 0x7603990' 
*** First throw call stack: 
(0x171b012 0x1428e7e 0x17a64bd 0x170abbc 0x170a94e 0x521e 0x143c705 0x373920 0x3738b8 0x434671 0x434bcf 0x433d38 0x3a333f 0x3a3552 0x3813aa 0x372cf8 0x2652df9 0x2652ad0 0x1690bf5 0x1690962 0x16c1bb6 0x16c0f44 0x16c0e1b 0x26517e3 0x2651668 0x37065c 0x25dd 0x2505) 

Trả lời

31

Từ điển của bạn không thay đổi được - là một số NSDictionary chứ không phải là NSMutableDictionary. Sửa lỗi đó và nó sẽ hoạt động tốt.

7

Bạn cần phải sử dụng một NSMutableDictionary - stack trace cho thấy bạn đang sử dụng một __NSDictionaryI, (NSDictionary) là bất biến

22

Tôi chạy vào lỗi này một lần khi tôi vô tình công bố một tài sản copy như vậy:

@property (nonatomic,copy) NSMutableDictionary* downloadHandlers; 

khi tôi đã làm điều này trong init tôi:

self.downloadHandlers = [[NSMutableDictionary alloc] init]; 

tôi ACTU đồng minh có một từ điển bất biến. Tôi đã có thể mong đợi rằng gọi copy trên một đối tượng có thể thay đổi cũng sẽ cho tôi một đối tượng có thể thay đổi, nhưng dường như không. Dù sao, loại bỏ từ khóa copy (mà tôi chưa bao giờ có ý định ở đó ngay từ đầu) đã khắc phục được sự cố.

+0

Đây chính xác là vấn đề của tôi. Cảm ơn! –

+0

Tôi đã gặp sự cố tương tự này. Cảm ơn!! – coolcool1994

2

Vì câu trả lời hàng đầu cho biết bạn cần sử dụng NSMutableDictionary thay vì NSDictionary. Và trong trường hợp bạn muốn sử dụng literals, sử dụng mutableCopy như:

NSMutableDictionary* dict = [@{@"key": @"value"} mutableCopy]; 

Vì vậy, chìa khóa mà bạn có thể tái assign sử dụng

dict[@"key"] = @"new-value"; 
+0

Cẩn thận .. literals chỉ kết thúc bằng cách sử dụng [NSDictionary alloc] initWithObjectsAndKeys, đó là nil chấm dứt ... –

3

Vấn đề này xảy ra hầu hết thời gian khi chúng ta đang đối phó với một trang web -service response vì dữ liệu nhận được là không thay đổi. Khi bạn cố gắng thay đổi dữ liệu bất biến, ứng dụng chắc chắn sẽ sụp đổ. Tôi hy vọng đoạn mã sau sẽ hữu ích.

NSMutableDictionary *headerData; 

/*Every time you need to allocate memory to the corresponding MutableDictionary variable*/ 

headerData =[[NSMutableDictionary alloc ]initWithDictionary:response[@"Header"]]; 
3

Trong trường hợp của tôi, tôi đã có một mã nhanh chóng trả về giá trị trong [AnyHashable: AnyObject] định dạng, tôi đã phải chuyển nó sang NSMutableDictionary,

NSMutableDictionary *logDict = [[NSMutableDictionary alloc]initWithDictionary:[[AnalyticsManager shared]addCommonPropertiesWithProperties:logDict]];

đâu như [[AnalyticsManager chia sẻ] addCommonPropertiesWithProperties: logDict] phần này trả về ở định dạng [AnyHashable: AnyObject]. Điều đó đã khắc phục được sự cố của tôi.

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