Objective c 目标C:如何检查一个类是否被一个类别扩展?

Objective c 目标C:如何检查一个类是否被一个类别扩展?,objective-c,categories,Objective C,Categories,在Java中,您可以使用instanceof检查一个类是否扩展了另一个类或实现了一个接口 在Objective-C中,您可以使用isKindOfClass检查一个类是否扩展了另一个类: if ([myObject isKindOfClass:[AnClass class]]) { } 但是我如何检查类是否被类别扩展 编辑2 不幸的是,我第一次编辑的代码有点混乱和荒谬,对不起!现在,这是我的新代码: if ([parentViewContr conformsToProtocol:@protoc

在Java中,您可以使用
instanceof
检查一个类是否扩展了另一个类或实现了一个接口

在Objective-C中,您可以使用
isKindOfClass
检查一个类是否扩展了另一个类:

if ([myObject isKindOfClass:[AnClass class]]) { }
但是我如何检查类是否被类别扩展


编辑2 不幸的是,我第一次编辑的代码有点混乱和荒谬,对不起!现在,这是我的新代码:

if ([parentViewContr conformsToProtocol:@protocol(ICheckBox)]) {
我将解释整个问题:
我有一个类
ViewCustomerCreate
,它扩展了
UITableViewController
ViewCustomerCreate
通过类别
ICheckBox
进行扩展。这是我的代码,不起作用:

- (void)closeModalView {
    UINavigationController *parent = (UINavigationController *)self.navigationController.parentViewController;
    UIViewController *parentViewContr = parent.topViewController;
    
    if ([parentViewContr isKindOfClass:[id<ICheckBox> class]]) { // ERROR-MESSAGE see below
        id<ICheckBox> parent2 = (id<ICheckBox>)parentViewContr; // works fine :-)
        [parent2 setSelectedElementId:checkedIndex]; // works fine :-)
    }   
    
    [self.navigationController dismissModalViewControllerAnimated:YES];
}

无法检查类是否由类别扩展,但可以检查实例是否响应特定选择器,方法是:

- (BOOL)respondsToSelector:(SEL)sel;
在Objective-C中,您应该少担心对象是什么,多关心对象能做什么

如果它走路像鸭子,听起来像鸭子,看起来像鸭子,那么它可能会飞,你知道我的意思吗

您应该这样使用:

if ([myObject respondsToSelector:@selector(myMethod:)])
{
    // do whatever you need to do
}

请注意,因为您提到了Java接口。您可以使用以下方法检查对象是否实现了协议(类似于Java接口,但不完全相同):

- (BOOL)conformsToProtocol:(Protocol *)aProtocol;

如果已在UIViewController上定义了类别,则没有未应用该类别的UIViewController实例。因此,运行时检查没有意义

让我们看看您的实际问题:

parent.setMySpecialValue = 1; // DOES NOT WORK :-(
“不起作用”到底是什么意思?您是否遇到编译器错误或运行时错误。如果是前者,则有几个可能的问题需要解决:

  • 您尚未在使用该方法的源文件中包含包含该类别的头文件
  • 这是一个您命名不正确的属性。如果属性名为
    mySpecialValue
    ,则该行代码应为:

    parent.mySpecialValue = 1;
    


  • 到目前为止,类别无法定义实例变量,因此拥有一个合成属性可能是一个问题,因此这也可能是您的问题,但您需要提供更多关于“不起作用”的含义的信息。

    谢谢您的回答!我编辑了我的问题并解释了整个问题。类别不像子类,你没有类别的实例。类别将其方法添加到已存在的类中。如果将类别添加到
    NSObject
    中,则所有
    NSObject
    实例都将具有新方法。我的答案仍然有效。如果你解释为什么它“不起作用”,并告诉我你得到了什么警告或什么错误,我可以帮助你,但就目前而言,我的答案是你应该做什么。同样在将来,与其等待答案,然后编辑你的问题来解释“整体”问题,不如先解释“整体”问题。非常感谢你,Jasarien!我现在更新了我的问题。我的第一次编辑有点混乱,对不起…@Manni,
    如果([parentViewContr isKindOfClass:[id class]])
    完全是胡说八道:)-
    id
    正在检查id是否实现了协议,这是胡说八道,因为id不是任何对象的实例。就像我一直说的,你需要在我的回答中使用这个方法。类别不是协议。不能用同样的方法检查它们。类别只向类添加方法,而不像子类化那样扩展它们。因此,类别不是类,因此不能在检查中使用,例如
    isKindOfClass:
    。请理解这一点。你的编辑并没有真正明确你想要什么。我不知道为什么那一行不起作用(属性不存在吗?它存在吗,但是有一个错误的实现吗?什么?),而且你没有解释那一行代码与一个类别有什么关系。曼尼建议在调用方法之前检查方法,这似乎是最好的方法。@chuck,这是我的建议,曼尼是提问者;)你说得对,贾萨琳和恰克。。。给我几分钟时间再次编辑我的问题。。。我将尝试在我的代码中进行一些更改…非常感谢您的帮助!我第二次编辑我的问题。非常感谢你,杰里米!我现在更新了我的问题。我的第一次编辑有点混乱,对不起。。。
    [parent setMySpecialValue: 1];