Objective c 代理和ARC不兼容?

Objective c 代理和ARC不兼容?,objective-c,automatic-ref-counting,Objective C,Automatic Ref Counting,我正在尝试为数据库存储过程实现代理。其思想是让我的代码在数据库中找到一系列存储过程,然后在内存中创建一个代理对象,该对象将实现与这些存储过程匹配的方法。该代理对象可以从NSProxy或NSObject派生,两者都可以工作。基本思想是,对我的代理对象进行的任何方法调用都将转到resolveInstanceMethod:并在该方法调用与数据库中的存储过程匹配时在那里进行处理 但在接近我的目标之前,ARC似乎不允许我对未声明的方法进行方法调用,这让我很困惑。早在ARC之前的几天,我们从编译器收到了类似

我正在尝试为数据库存储过程实现代理。其思想是让我的代码在数据库中找到一系列存储过程,然后在内存中创建一个代理对象,该对象将实现与这些存储过程匹配的方法。该代理对象可以从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,我无法在运行时向类添加方法。

mwehlou

首先,如果您没有向我们显示任何代码,那么很难帮助您

其次,如果您知道将提供实例方法,则可以使用以下
#pragma
s使警告静音:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"

[Your Selector Based Code Here]

#pragma clang diagnostic pop
如果这是警告符号,那么您可能可以在Xcode的构建设置中找到它


Andrew

我在问题中添加了代码,但正如您所看到的,代码是100%微不足道的。问题是,如果使用ARC,则非ARC下的警告和pragma可以抑制的内容是完全错误的。没有任何东西阻止您在ARC项目中向对象动态添加方法。编译器反对您缺少已定义的方法。传统上,这是通过-performSelector:withObject:message处理的。ARC需要知道方法中使用的命名约定以及它是否返回值。(是的,我知道编译器可以从您使用它们的方式推断出这些类型,但苹果公司选择不这样做。)mwhelou,我想知道为什么添加没有标题的方法对您很重要?非ARC代码上的警告表示您正在进入Objective-C的一个角落。由于存在一个几乎微不足道的修复,为什么使用未定义的消息有用?此外,还可以基于每个文件关闭圆弧。在构建阶段对文件使用-fno objc arc。安德烈的想法是动态地为数据库存储过程创建一个代理对象。将根据在数据库中找到的过程添加这些方法。“performSelector”将非常难看,因为这些存储过程可能有许多不同类型的参数。-马丁