好的,这就是我找到的解决方案……一旦你知道该怎么做,结果就很简单了。首先覆盖 '- (id) forwardingTargetForSelector:(SEL)aSelector' 并返回 iVar:
- (id) forwardingTargetForSelector:(SEL)aSelector{
return iVar;
}
当运行时正在寻找一个方法而找不到一个方法时,它会调用这个方法来查看是否有另一个对象可以将消息转发到。请注意,此方法通常返回 nil,如果您在此处返回 nil,您的程序将崩溃(这是适当的行为)。
问题的第二部分是在您尝试发送未声明的消息时隐藏编译器错误/警告。这很容易通过声明一个您没有实现的类别来完成。
@interface Class (iVarClassMethods)
@propoperty (strong) Class *property1;
......more properties
@end
只要您不在任何地方(即 aka )放入实现,@implementation Class (category)
编译器就不会抱怨(它会假设实现在某处......)。
现在我看到的唯一缺点是,如果您更改 iVar 类接口中的任何属性,您需要确保更新所有使用上述方法的其他类,否则当另一个类尝试发送时您会崩溃现在什么是错误的方法(编译器不会事先警告你)。但是,这可以解决。您可以在类别中声明协议。因此,您可以为 iVar 类创建一个单独的协议,并将您希望的方法/属性从 iVar 类移出到协议中。
@protocol iVarClassProtocol
@propoperty (strong) Class *property1;
......more properties
@end
将该协议添加到 iVar 子类,以便它现在具有通过协议声明的那些方法。
@interface iVarClass <iVarClassProtocol>
....other methods/properties you don't need forwarded
@end
最后,只需将协议添加到类别中。因此,您将拥有的不是上述带有显式声明的类别:
@interface Class (iVarClassMethods) <iVarClassProtocol>
@end
现在,如果您需要更改任何要转发的属性/方法,您可以在协议中更改它们。然后,当您尝试将错误的方法发送到转发类时,编译器会警告您。