如何定义向实现特定协议的类添加方法的类别?

时间:2011-08-26 20:03:34

标签: objective-c objective-c-category

我想为实现SOManagedObject协议的NSManagedObject的子类添加一些方法。我试过像这样定义它:

@interface NSManagedObject <SOManagedObject> (MyExtensionMethods)
    ...
@end

......但这似乎没有效果。如何定义向实现特定协议的类添加方法的类别?

4 个答案:

答案 0 :(得分:4)

一般而言,在所有这些类上定义这样的类别是不容易解决的。但是您的实际问题似乎更简单:如何将类别方法添加到NSManagedObject以仅用于实现<SOManagedObject>的子类?这是可以解决的。

您要做的是将方法添加到NSManagedObject,然后检查您正在使用的实例是否可以处理您要从<SOManagedObject>发送的消息。

让我们假设我们得到了:

/* SOManagedObject.h */
@protocol SOManagedObject
- (void)frobble_so;
- (void)bobble_so;
@end

现在让我们为实现NSManagedObject的所有SOManagedObject子类添加一个类别方法:

/* NSManagedObject+SOConvenience.h */
@interface NSManagedObject (SOConvience)
/* Frobbles and bobbles - no effect on non-<SOManagedObject>-conforming
 * instances. */
- (void)frobbleAndBobble_so;
@end

为此,我们实现了这样的方法:

/* NSManagedObject+SOConvenience.m */
@implementation NSManagedObject (SOConvenience)
- (void)frobbleAndBobble_so
{
    if (![self conformsToProtocol:@protocol(SOManagedObject)]) return;

    NSLog(@"%s: Thunderbirds are GO! Let's frobble and bobble!", __func__);
    [self frobble_so];
    [self bobble_so];
}
@end

您可以选择断言以确保您不将方法发送到错误的对象,或者您可以使用respondsToSelector:而不是检查协议一致性。无论什么漂浮在你的船上,但这种一般的方法应该带你到你想去的地方。

答案 1 :(得分:1)

我认为不可能。之前回答了类似的问题:

Defining categories for protocols in Objective-C?

答案 2 :(得分:0)

编辑:我误解了这个问题;我不认为可以在不弄乱Objective-C运行时的情况下做你想做的事情。请参阅Dave在下面的评论,了解为什么我的答案不正确。


如果你交换协议和类别表示法,你应该能够这样做:

@interface NSManagedObject (MyExtensionMethods) <SOManagedObject>
    ...
@end

答案 3 :(得分:0)

Adam Sharp posted a solution为我工作。

它涉及3个步骤:

  1. 在协议上定义要添加为@optional的方法。
  2. 使您想要扩展的对象符合该协议。
  3. 在运行时将这些方法复制到这些对象中。
  4. 查看链接以获取完整详细信息。