Категории с одинаковым именем функции в Objective C
Если проект XCode имеет две категории:
@implementation NSData (test1)
- (void) testData {
NSLog(@"test data 1");
}
@end
а также
@implementation NSData (test2)
- (void) testData {
NSLog(@"test data 2");
}
@end
Каков ожидаемый результат для этого:
NSData* testData = [[NSData alloc] init];
[testData testData];
Вывод, который я получаю всегда
#import "NSData+test1.h"
Любые объяснения по этому поводу? Есть ли способ форсировать первую категорию?
Проблема здесь в том, что если вы импортируете два SDK со статическими библиотеками, которые имеют категории с одинаковыми именами, как обойти эту проблему. Я предполагаю, что единственный способ - попросить создателя SDK использовать префикс для имен методов?
1 ответ
Поведение не определено и его следует избегать. Вот соответствующая документация:
Избегайте столкновений имен методов категорий
Поскольку методы, объявленные в категории, добавляются в существующий класс, вы должны быть очень осторожны с именами методов.
Если имя метода, объявленного в категории, совпадает с именем метода в исходном классе или методом в другой категории того же класса (или даже суперкласса), поведение не определено относительно того, какая реализация метода используется в время выполнения. Это менее вероятно, если вы используете категории со своими собственными классами, но могут вызывать проблемы при использовании категорий для добавления методов в стандартные классы Cocoa или Cocoa Touch.