2012-11-15 32 views

Trả lời

3

Để xử lý "không được công nhận selector" ngoại lệ, chúng ta nên ghi đè lên hai phương pháp:

- (void)forwardInvocation:(NSInvocation *)anInvocation; 
- (NSMethodSignature*)methodSignatureForSelector:(SEL)selector; 

Trong trường hợp này, nếu chúng ta muốn NSNull để thực hiện các phương pháp NSSString nếu "chọn không được công nhận" ngoại lệ xảy ra, chúng ta nên làm này:

@interface NSNull (InternalNullExtention) 
@end 



@implementation NSNull (InternalNullExtention) 

- (NSMethodSignature*)methodSignatureForSelector:(SEL)selector 
{ 
    NSMethodSignature* signature = [super methodSignatureForSelector:selector]; 
    if (!signature) { 
     signature = [@"" methodSignatureForSelector:selector]; 
    } 
    return signature; 
} 

- (void)forwardInvocation:(NSInvocation *)anInvocation 
{ 
    SEL aSelector = [anInvocation selector]; 

    if ([@"" respondsToSelector:aSelector]) 
     [anInvocation invokeWithTarget:@""]; 
    else 
     [self doesNotRecognizeSelector:aSelector]; 
} 
@end 
1

Có. Xem ví dụ về forwardInvocation: trong tài liệu dành cho NSObject tại đây: https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html

Về cơ bản, bạn ghi đè lên trướcVị trí và được gọi khi đối tượng không có phương thức khớp với một số bộ chọn nhất định.

+0

Cảm ơn! Tôi nhận thấy bên cạnh - (void) forwardInvocation: (NSInvocation *) anInvocation, tôi cũng cần phải thực hiện - (NSMethodSignature *) methodSignatureForSelector: (SEL) chọn – Hang

3

Bạn có thể sử dụng danh mục để thêm phương thức vào các lớp học NSNullNSNumber. Đọc về các loại trong The Objective-C Programming Language.

Bạn có thể triển khai methodSignatureForSelector:forwardInvocation: để xử lý bất kỳ thư nào mà không xác định rõ ràng tất cả thư bạn muốn xử lý. Đọc về chúng trong số NSObject Class Reference.

+0

Awesome! Đã giải quyết :) Cảm ơn! – Hang

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