我正在尝试为数据库存储过程实现代理。这个想法是让我的代码在数据库中找到一系列存储过程,然后在内存中创建一个代理对象,该对象将实现与这些存储过程匹配的方法。该代理对象可以从 NSProxy 或 NSObject 派生,两者都应该工作。基本思想是,对我的代理对象进行的任何方法调用都将转到 resolveInstanceMethod: 并在该方法调用与数据库中的存储过程匹配时在那里进行处理。
但在接近我的目标之前,我被 ARC 难住了,似乎不允许我对未声明的方法进行方法调用。回到 ARC 之前的日子,我们从编译器收到类似“对象可能不响应选择器”的警告,就是这样,但启用 ARC 后,我收到一个编译器错误,提示“选择器没有已知的实例方法.. ."。如果我首先将代理对象强制转换为 (id),也会发生这种情况。
这一切似乎都在暗示 ARC 与方法的运行时发现不兼容,这是 Objective-c 的基本特征之一。似乎要求所有使用的方法都必须在编译之前在接口中声明,就像在 C++ 中一样。
或者,更有可能的是,我错过了一些重要的东西。如果是这样,是什么?
编辑以包含代码:
int main(int argc, const char * argv[])
{
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!");
MyTargetClass *mtc = [[MyTargetClass alloc] init];
[mtc doSomething];
}
return 0;
}
MyTargetClass 不包含任何内容:
@interface MyTargetClass : NSObject
@end
如果在非 ARC 项目中,[mtc doSomething] 调用会引发警告,但会在 ARC 中引发编译器错误。恕我直言,这意味着如果使用 ARC,我无法在运行时向类添加方法。