【问题标题】:Proxies and ARC, incompatible?代理和 ARC,不兼容?
【发布时间】:2012-05-02 08:27:16
【问题描述】:

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

【问题讨论】:

    标签: objective-c automatic-ref-counting


    【解决方案1】:

    mwehlou,

    首先,如果您不向我们展示任何代码,那么真的很难帮助您。

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

    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
    
    [Your Selector Based Code Here]
    
    #pragma clang diagnostic pop
    

    如果那是警告符号,那么您可以在 Xcode 的构建设置中找到它。

    安德鲁

    【讨论】:

    • 我在问题中添加了代码,但如您所见,代码是 100% 微不足道的。问题是,如果使用 ARC,非 ARC 下的警告可以被您的 pragma 抑制,这将是一个彻底的错误。
    • 没有什么可以阻止您在 ARC 项目中动态地向对象添加方法。编译器反对您缺少定义的方法。传统上,这是使用 -performSelector:withObject: 消息处理的。 ARC 需要知道方法中使用的命名约定以及它是否返回值。 (是的,我知道编译器可以根据您使用它们的方式推断出这些类型,但 Apple 选择不这样做。)
    • mwhelou,我想知道为什么添加没有标题的方法对您很重要?非 ARC 代码上的警告表明您正在进入 Objective-C 的极端情况。由于有一个几乎微不足道的修复,为什么使用未定义的消息有用?此外,您可以按文件关闭 ARC。在构建阶段对文件使用 -fno-objc-arc。安德鲁
    • 这个想法是动态地为数据库存储过程创建一个代理对象。这些方法将根据在数据库中找到的过程来添加。 “performSelector”真的很难看,因为这些存储过程可以有许多不同类型的参数。 ——马丁
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 2012-09-05
    • 2013-01-10
    • 1970-01-01
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多