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