2013-03-06 35 views
10

tôi có một ngoại lệ mà nói:- [NSNull objectForKeyedSubscript:]: chọn không được công nhận gửi đến dụ

-[NSNull objectForKeyedSubscript:]: unrecognized selector sent to instance

Có nói rằng tôi đang cố gắng để truy cập vào một đối tượng NSNull với một chìa khóa? Bất kỳ ý tưởng nào gây ra điều này và cách sửa lỗi hoặc gỡ lỗi thêm?

+1

Có thể dễ dàng tìm thấy. Bạn đang subscripting ở đâu? – CodaFi

+2

Dường như bạn có một NSNull nơi bạn đang mong đợi một cái gì đó khác. Một số mã sẽ giúp mọi người giúp bạn tìm ra điều này. –

+1

Cách khắc phục nó là không cố gắng objectForKeyedSubscript trên một đối tượng NSNull. (Tôi cá rằng bạn đang xử lý một số dữ liệu JSON và không được chuẩn bị cho giá trị NULL.) –

Trả lời

13

Cách khắc phục nó là không thử objectForKeyedSubscript trên đối tượng NSNull. (Tôi đang đặt cược bạn đang xử lý một số dữ liệu JSON và không được chuẩn bị cho một giá trị NULL.)

(Và rõ ràng objectForKeyedSubscript là những gì các mảng mới [x] ký hiệu chuyển thành.)

(Lưu ý mà bạn có thể kiểm tra NSNull bằng cách chỉ cần so sánh với == đến [NSNull null], vì có một và chỉ một đối tượng NSNull trong ứng dụng.)

+0

Sẽ truy cập từ điển có khóa không hợp lệ để ném ngoại lệ này? – Boon

+1

@Boon No. Điều đó sẽ trả về 'nil', rất khác với' NSNull'. –

+2

@Boon - Như Mike D nói, sử dụng một khóa không hợp lệ trên một từ điển sẽ chỉ trả về một con số không - ngoại lệ.Một chỉ mục không hợp lệ trên một mảng sẽ ném một ngoại lệ, nhưng nó là một NSRangeException, không phải là "bộ chọn không được nhận ra". Tuy nhiên, lưu ý rằng bạn sẽ nhận được "bộ chọn không nhận dạng" nếu bạn cố gắng "lập chỉ mục" một NSString hoặc một NSView hoặc một số đối tượng không phải mảng/từ điển khác - đó là lỗi chung có nghĩa là lớp được chỉ định không hỗ trợ phương pháp đã chỉ định. –

2

Giá trị bao giờ bạn lưu trữ, mặc dù trình chỉnh sửa cho bạn biết, tại thời điểm chạy, bạn đang lưu trữ NSNull và sau đó cố gắng gọi objectForKeyedSubscript. Tôi đoán điều này xảy ra trên những gì được mong đợi là một NSDictionary. Một số điều như:

NSString *str = dict[@"SomeKey"]

Hoặc là một đoạn mã trước không được làm công việc của mình và điều tra ở đó, hoặc thực hiện một số xác nhận:

NSDictionary *dict = ...; 

if ([dict isKindOfClass:[NSDictionary class]]) { 
    // handle the dictionary 
} 
else { 
    // some kind of error, handle appropriately 
} 

tôi thường có loại kịch bản khi giao dịch với thông báo lỗi từ các hoạt động mạng.

1

Tôi đề nghị thêm một danh mục vào NSNull để xử lý điều này giống như cách bạn mong đợi một chỉ số gọi để được xử lý nếu nó được gửi đến số không.

@implementation NSNull (Additions) 

- (NSObject*)objectForKeyedSubscript:(id<NSCopying>)key { 
    return nil; 
} 

- (NSObject*)objectAtIndexedSubscript:(NSUInteger)idx { 
    return nil; 
} 

@end 

Một cách đơn giản để kiểm tra là như thế này:

id n = [NSNull null]; 
n[@""]; 
n[0]; 

Với thể loại này, xét nghiệm này cần được xử lý thành công/nhẹ nhàng.

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