Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 我可以使用一个category覆盖一个方法吗?该方法本身在超类的category中?_Objective C_Inheritance_Categories_Undefined Behavior - Fatal编程技术网

Objective c 我可以使用一个category覆盖一个方法吗?该方法本身在超类的category中?

Objective c 我可以使用一个category覆盖一个方法吗?该方法本身在超类的category中?,objective-c,inheritance,categories,undefined-behavior,Objective C,Inheritance,Categories,Undefined Behavior,是否定义了调用-myMethod的哪个实现 Kochan在Objective-C中的编程中指出: 如果多个类别为同一类声明了具有相同名称的方法,则不会定义调用时将执行的方法 但我不确定在这种情况下,超类上的一个类别是否被视为同一类上的一个类别。我的直觉告诉你,你会没事的,但唯一知道的方法是尝试。我相信不确定性只存在于同一个类中,而不是超级/子类关系。我的直觉告诉你,你会没事的,但唯一知道的方法是尝试。我相信不确定性只存在于同一个类中,而不是超级/子类关系。虽然我找不到引用,但我认为很明显,MyS

是否定义了调用-myMethod的哪个实现

Kochan在Objective-C中的编程中指出:

如果多个类别为同一类声明了具有相同名称的方法,则不会定义调用时将执行的方法


但我不确定在这种情况下,超类上的一个类别是否被视为同一类上的一个类别。

我的直觉告诉你,你会没事的,但唯一知道的方法是尝试。我相信不确定性只存在于同一个类中,而不是超级/子类关系。

我的直觉告诉你,你会没事的,但唯一知道的方法是尝试。我相信不确定性只存在于同一个类中,而不是超级/子类关系。

虽然我找不到引用,但我认为很明显,MySubclass MyOtherCategory中的实现优先。该类别的方法被添加到该特定类中,因此MyOtherCategory实现将属于您的子类,并且在消息分派过程中,在转到超类之前将对其进行查找


正如Objective-C手册所指出的,可可中的许多方法都被分类。如果没有很好地定义查找顺序,则无法覆盖子类的categories中的任何方法,这将使categories几乎毫无用处。

虽然我找不到引用,但我认为很明显,MySubclass MyOtherCategory中的实现优先。该类别的方法被添加到该特定类中,因此MyOtherCategory实现将属于您的子类,并且在消息分派过程中,在转到超类之前将对其进行查找


正如Objective-C手册所指出的,可可中的许多方法都被分类。如果没有很好地定义查找顺序,则无法在子类的categories中重写任何这些方法,这将使categories几乎毫无用处。

关于未定义行为的问题是,它是未定义的。如果它是未定义的行为,而我尝试了它,并且它在OSX10.5/10.6中工作,那么不能保证他们不会在10.7中更改它。如果这种行为被明确定义为我们都怀疑它的行为方式,那么它对我来说会有一定的帮助,但是如果它可能会让我或其他人头疼的话,我可以不这样做。在这一点上,也有相当多的好奇心。不过,这种特定的行为并不是没有定义的。如果是这样,您将无法重写系统基类中的方法。我很确定类别加载顺序只是在类中没有定义,而不是在它的子类中。超类的所有类别都应该在您的类别加载之前加载。这很有意义。我试图解释的是,我个人不确定它是否未定义,我所寻找的是确凿的证据,证明你和我的直觉事实上是正确的。虽然不是决定性的,@Felixyz和你关于系统基类的观点至少是一个非常有力的指示。关于未定义行为的问题是,它是未定义的。如果它是未定义的行为,而我尝试了它,并且它在OSX10.5/10.6中工作,那么不能保证他们不会在10.7中更改它。如果这种行为被明确定义为我们都怀疑它的行为方式,那么它对我来说会有一定的帮助,但是如果它可能会让我或其他人头疼的话,我可以不这样做。在这一点上,也有相当多的好奇心。不过,这种特定的行为并不是没有定义的。如果是这样,您将无法重写系统基类中的方法。我很确定类别加载顺序只是在类中没有定义,而不是在它的子类中。超类的所有类别都应该在您的类别加载之前加载。这很有意义。我试图解释的是,我个人不确定它是否未定义,我所寻找的是确凿的证据,证明你和我的直觉事实上是正确的。虽然不是决定性的,@Felixyz和您关于系统基类的观点至少是一个非常有力的指示。这是正确的。类别只影响它们所针对的类。这是正确的。类别只影响它们所定义的类。
@interface MySuperclass : NSObject {

}

@end

@interface MySuperclass (MyCategory)

- (void)myMethod;

@end

@interface MySubclass : MySuperclass {

}

@end

@interface MySubclass (MyOtherCategory)

- (void)myMethod;

@end