lớp Anonymous có thể được thực hiện với thư viện.Một vài tháng trước, tôi đã làm việc trên MMMutableMethods
ngã ba để cải thiện việc thực hiện cũ (thảo luận với tác giả) và thêm cơ chế của riêng tôi mà không cần bất kỳ thao tác thời gian chạy obj-c nào.
https://github.com/k06a/MMMutableMethods
A. cơ chế đầu tiên hoạt động trên obj-c runtime tạo lớp:
MM_CREATE(MM_REUSE,^(Class class){
[class addMethod:@selector(onResultWithId:)
fromProtocol:@protocol(AMCommandCallback)
blockImp:^(id this,id res){
NSLog(@"onResultWithId: %@",res);
}];
[class addMethod:@selector(onErrorWithJavaLangException:)
fromProtocol:@protocol(AMCommandCallback)
blockImp:^(id this,JavaLangException *e){
NSLog(@"onErrorWithJavaLangException: %@",e);
}];
})
cơ chế
B. Thứ hai hoạt động trên thông điệp đơn giản chuyển tiếp thực hiện:
MM_ANON(^(MMAnonymousClass *anon){
[anon addMethod:@selector(onResultWithId:)
fromProtocol:@protocol(AMCommandCallback)
blockImp:^(id this,id res){
NSLog(@"onResultWithId: %@",res);
}];
[anon addMethod:@selector(onErrorWithJavaLangException:)
fromProtocol:@protocol(AMCommandCallback)
blockImp:^(id this,JavaLangException *e){
NSLog(@"onErrorWithJavaLangException: %@",e);
}];
})
Đầu tiên tạo các lớp obc-j mới trong thời gian chạy, nó cho phép bạn tạo các lớp MM_CREATE_CLASS(MM_REUSE, *)
và các cá thể trực tiếp với MM_CREATE(MM_REUSE, *)
. Các lớp học sẽ chỉ được tạo khi thực hiện lần đầu và được sử dụng lại theo mặc định, nhưng bạn có thể tránh sử dụng lại bằng cách gọi MM_CREATE_CLASS_ALWAYS(*)
và MM_CREATE_ALWAYS(*)
.
Cơ chế thứ hai không tạo ra bất kỳ phiên bản thời gian chạy nào, chỉ cần nhớ các khối cho bộ chọn và các cuộc gọi phương thức chuyển tiếp đến chúng.
Tôi làm theo cách thứ hai để không tạo nhiều lớp trong thời gian chạy. IMHO nó an toàn hơn và đủ mạnh mẽ.
Để sử dụng thư viện này chỉ:
pod 'MMMutableMethods', :git => 'https://github.com/k06a/MMMutableMethods'
thể trùng lặp của [? Anonymous thực hiện ủy nhiệm trong Objective-C] (http://stackoverflow.com/questions/766475/anonymous-delegate-implementation-in- Mục tiêu-c) –
@Dave DeLong Làm rõ tiêu đề để phân biệt với câu hỏi đó. Trong trường hợp này ngữ cảnh là một phương thức tĩnh. – hpique
ngữ cảnh không quan trọng. Bạn phải cung cấp một đối tượng ('id') làm đại biểu, và câu hỏi khác khá rõ ràng trả lời rằng không có thứ như một lớp ẩn danh trong Objective-C (chưa), vì vậy bạn sẽ phải sử dụng một đối tượng bình thường. –