减少Objective C中重复的代码

时间:2014-03-09 05:38:58

标签: objective-c

我有一个定义一些属性的协议。我的文档类符合此协议。对于我喜欢这些变量的任何其他类,我将文档类设置为委托,以便我可以在其中编写getter / setter,如:

- (NSArray *)array
{
    if (self.delegate) {
        return self.delegate.array;
    } else {
        return [[NSArray alloc] init];
    }
}

这样我就有一个地方可以存储我的东西(没有不必要的副本),我只是问我的代表,直到链到达文档类。问题:如果我向协议添加一个新变量,并且必须在任何地方添加getter / setter!而且由于它们都是一样的,我正在寻找一种方法来外包这段重复的代码。

2 个答案:

答案 0 :(得分:1)

将代理转发方法问题的一般解决方案称为“消息转发”(并不奇怪),并且在此处记录良好:

https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ObjCRuntimeGuide/Articles/ocrtForwarding.html

正如您在阅读该页面时所看到的那样,解决的问题与您提出的问题非常相似。

答案 1 :(得分:1)

黑客就是在category上创建NSObject并将其包含在您需要的地方。在该类别中,

  • 您可以检查实例是否响应delegate属性getter选择器
  • 如果是,则动态执行getter以获取委托实例。
  • 然后动态执行属性的getter选择器以获取其值。

以下是NSObject+Extentions.m中的代码应如何显示:

@implementation NSObject (Extentions)

- (NSArray *)array {
    if ([self respondsToSelector:@selector(setDelegate:)]) {
        id delegate = [self performSelector:@selector(delegate)];
        return [delegate performSelector:@selector(array)];
    } else {
        return [[NSArray alloc] init];
    }
}

@end