objective-c - Objective-C 中的动态方法创建

标签 objective-c dynamic

书中The Pragmatic Programmer ,作者建议所有方法输入都应该经过验证。这样可以尽早发现方法中的问题并轻松追踪其来源。

在我的 Mac 应用程序中,我通过创建一个 Assert 类来完成此操作。这个类有几个类方法。这些方法确定是否满足某些先决条件,如果不满足,则抛出异常。典型的断言可能如下所示:

-(void) setWidth: (int) theWidth {
    [Assert integer: width isGreaterThanInteger: 0];
    width = theWidth;
}

这非常有效,并且显着减少了我花在寻找错误上的时间。然而,我最近注意到一些断言方法作为谓词非常有用。例如,我的 integer:isGreaterThanInteger:andLessThanInteger: 和我的 stringIsNotEmpty: 方法同样有用。为此,我创建了第二个类 Predicate,其中填充了几个更有用的谓词方法。因此,我从断言方法中获取逻辑,并将其移至 Predicate 中,然后重写我的 Assert 方法,如下所示:

if ![Predicate predicateMethod]
    throw exception

这已经变成了一场维护噩梦。如果我在 Predicate 中更改方法名称,我还必须在 Assert 中更改它以保持一致。如果我更新 Assert 方法的文档,那么我必须对 Predicate 方法执行相同的操作。

理想情况下,我希望重建 Assert 类,以便在对其调用任何方法时,它会拦截选择器。然后可以检查 Predicate 类以查看它是否响应选择器,如果响应,则使用传递到 Predicate 的相同参数在 Predicate 上调用该方法。 断言方法。如果 Predicate 方法返回 false,则会引发异常。

有没有办法在 Objective-C 中做到这一点?

谢谢。

最佳答案

您可以使用-forwardingTargetForSelector:简单地将方法转发到另一个对象,但如果您想要高级行为(例如检查返回值以查看它是否为 false),您可能需要使用 -forwardInvocation: 。 (但是,请注意,文档说这比前一个选项“昂贵得多”。)

关于objective-c - Objective-C 中的动态方法创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7185122/

相关文章:

ios - iOS 8.1 中 CGContextDrawPDFPage 内存泄漏?

ios - iOS 9 的 xcode 7.1 缺少 Objective C 领域静态框架所需的 libc++.dylib

ios - 仅使用 UIActivityViewController 与特定应用共享内容

c# - 在 Silverlight 的 Canvas 上动态绘制图像

.net - 绑定(bind)到 ExpandoObject。属性更改不起作用

c# - 我可以在 .NET 4 中序列化 ExpandoObject 吗?

java - if 语句中的动态 AND 条件

ios - Xcode 7 警告 : object file was built for newer iOS version than being linked

ios - 从 NSMutableArray 对象属性中删除重复对象?

Excel为动态下拉列表创建数据验证唯一项,无需新列