Категории с одинаковым именем функции в 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.

Другие вопросы по тегам