- NSProxy是苹果官方推荐专门用来做消息转发的,内部有一个target属性,定位更加精准,效率非常高;
- NSProxy 跳过了消息转发的流程, 即本类/父类 方法缓存和方法列表中遍历查询方法的过程, 直接调用方法签名, 因此高效
- NSProxy和NSObject是同一个级别的类,都是基类, NSproxy 没有子类
- 注意forwardingTargetForSelector此方法被注释, 虽然使用它同样也可以实现消息转发, 但是使用它同样会走消息转发流程, 因此不推荐
@interface NSProxy <NSObject> {
__ptrauth_objc_isa_pointer Class isa;
}
+ (id)alloc;// 注意区别nsobject没有init方法
+ (id)allocWithZone:(nullable NSZone *)zone NS_AUTOMATED_REFCOUNT_UNAVAILABLE;
+ (Class)class;
- (void)forwardInvocation:(NSInvocation *)invocation;
- (nullable NSMethodSignature *)methodSignatureForSelector:(SEL)sel NS_SWIFT_UNAVAILABLE("NSInvocation and related APIs not available");
- (void)dealloc;
- (void)finalize;
@property (readonly, copy) NSString *description;
@property (readonly, copy) NSString *debugDescription;
+ (BOOL)respondsToSelector:(SEL)aSelector;
- (BOOL)allowsWeakReference API_UNAVAILABLE(macos, ios, watchos, tvos);
- (BOOL)retainWeakReference API_UNAVAILABLE(macos, ios, watchos, tvos);
// - (id)forwardingTargetForSelector:(SEL)aSelector;
@end
正确的nspoxy实现方式, 使用方法签名完成消息转发
//消息转发到target
//返回方法签名
- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel
{
return [self.target methodSignatureForSelector:sel];
}
//内部实现方法调用
- (void)forwardInvocation:(NSInvocation *)invocation
{
[invocation invokeWithTarget:self.target];
}