Mục tiêu-c có cung cấp cách chặn các cuộc gọi đến phương thức lớp không tồn tại không?Mục tiêu C và các phương pháp ma thuật trong lớp
Trả lời
Vâng, bạn có thể với resolveClassMethod: Phương pháp lớp (được xác định trên NSObject):
Đây cũng là một cái gì đó để xem ra cho (bối rối tôi lần đầu tiên): http://iphonedevelopment.blogspot.com/2008/08/dynamically-adding-class-objects.html
Phương pháp forwardInvocation
là những gì bạn sẽ muốn sử dụng. Nó được gọi tự động khi một bộ chọn không tồn tại được gọi trên một đối tượng. Hành vi mặc định của phương thức này là gọi doesNotRecognizeSelector:
(đó là những gì xuất ra thông tin gỡ lỗi cho bảng điều khiển của bạn), nhưng bạn có thể ghi đè lên nó làm bất cứ điều gì bạn muốn. Một phương pháp tiếp cận được khuyến cáo bởi Apple là có phương pháp này chuyển tiếp lời gọi phương thức đến một đối tượng khác.
- (void)forwardInvocation:(NSInvocation *)anInvocation
Lưu ý rằng forwardInvocation
là một hoạt động khá tốn kém. Một đối tượng NSInvocation cần được tạo bởi khung công tác và (tùy chọn) được sử dụng để gọi một bộ chọn trên một cá thể khác. Nếu bạn đang tìm phương pháp phát hiện nhanh hơn (tương đối) không tồn tại thì bạn có thể chọn triển khai forwardingTargetForSelector
thay thế.
- (id)forwardingTargetForSelector:(SEL)aSelector
Bạn nên Apple's documentation cho làm thế nào để ghi đè các phương pháp này có hiệu quả, có một số của Gotcha để xem ra cho, đặc biệt là khi trọng phương pháp forwardInvocation
trên cùng một đối tượng mà sẽ có các selectors thiếu.
Cơ chế chuyển tiếp phương thức lớp yêu cầu các phương thức lớp, không phải phương thức thể hiện. '+ (void) forwardingTargetForSelector: (SEL) sel;' '+ (void) forwardInvocation: (NSInvocation *) anInvocation;' Chức năng sau đó sử dụng một chức năng hỗ trợ: '+ (NSMethodSignature *) methodSignatureForSelector: (SEL) sel; ' – dmitri