Если две разные категории имеют одинаковый метод, то какая из них будет вызываться системой времени выполнения Objective C? - PullRequest
5 голосов
/ 10 сентября 2010

Если две разные категории имеют один и тот же метод, то какая из них будет вызываться целевой системой времени выполнения C ??

, например:

@interface ClassA (MathOps)
    -(void)CategoryMethod;
@end 

@interface ClassA (MathOps1)
-(void)CategoryMethod;
@end 

@implementation ClassA(MathOps1)
- (void) CategoryMethod{
    NSLog(@"Inside Category Method 2");
}
@end

@implementation ClassA(MathOps)
- (void) CategoryMethod{
    NSLog(@"Inside Category Method 1");
}
@end

Теперь, если я звоню, [ObjClassACategoryMethod] ;, Тогда какой из них называется?Почему?

Ответы [ 2 ]

8 голосов
/ 10 сентября 2010

Это не определено.Это зависит от того, какая категория загружается первой во время выполнения, и нет ли задокументированного порядка, в котором это происходит.

Итог: не делайте этого.:)

4 голосов
/ 10 сентября 2010

Как утверждает @Dave DeLong, поведение не определено.Один из методов «победит», и просто невозможно узнать, какой именно.Если какой-либо другой код зависит от метода потери, вы обнаружите, что отлаживаете некоторые потенциально странные ошибки.Лучше всего избегать ситуации все вместе.Это особая проблема при реализации «очевидных» вспомогательных методов.Если эти методы будут добавлены в будущей версии платформы, ваша категория либо переопределит новый метод в классе (если он находится в теле основного класса), либо может переопределить метод, если он добавлен в категорию.Eek.

Многие платформы Какао, которые предоставляют категории для существующих (например, Какао) классов, следуют шаблону, посредством которого они добавляют свой префикс класса к методу, чтобы минимизировать вероятность конфликта имен.Так, например, вы бы создали такие категории, как:

@interface NSObject (MyCategory)
- (void)myprefix_categoryMethod;
@end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...