Делают ли названия в Objective-C что-нибудь? - PullRequest
16 голосов
/ 16 апреля 2011

Класс можно расширить в Objective C, используя такую ​​категорию, как:

@interface NSString (CategoryName)
-(NSString *)myFabulousAddition;  // a fabulous additional method
@end

/////////////////////////////
@implementation NSString (CategoryName)

-(NSString *)myFabulousAddition {
    // do something fabulous...

}
@end

В этом небольшом примере я бы добавил метод myFabulousAddition к NSString.Затем я мог бы вызвать его по [anNSString myFabulousAddition], как если бы он был частью набора методов NSString.Замечательно и полезно.

В документах Apple , касающихся категорий , документация гласит:

Количество категорий, которые вы можете добавить в список, не ограничено.класс, но имя каждой категории должно быть различным, и каждый должен объявлять и определять свой набор методов.

Что если у вас что-то вроде этого:

@interface NSString (CategoryName)
-(NSString *)myFabulousAddition;  // a fabulous additional method
@end

@interface NSString (ANOTHERCategoryName)
-(NSString *)myFabulousAddition;  // a DIFFERENT fabulous additional method 
                                  // BUT with same name as the other category
@end


/////////////////////////////

@implementation NSString (CategoryName)

-(NSString *)myFabulousAddition {
    // do something fabulous...

}
@end
@implementation NSString (ANOTHERCategoryName)

-(NSString *)myFabulousAddition {
    // do something equally fabulous, but DIFFERENT...

}
@end

Отсутствиеимени в скобках указывает, что форма является расширением класса, например:

@interface MyObject ()   // No name -- an extension vs category to MyObject
- (void)setNumber:(NSNumber *)newNumber;
@end

Имеет ли имя категории какое-либо значение для компилятора или компоновщика?Является ли имя категории частью сигнатуры метода в любом случае, или оно является частью примитивного пространства имен?Если название категории не имеет смысла, как вы узнаете, что собираетесь потоптать другой метод и получить неопределенное поведение?

Ответы [ 5 ]

7 голосов
/ 16 апреля 2011

Чтобы избежать использования методов, нужно добавить префикс к именам методов вашей категории, например:

@interface NSString (MyCompanyCategoryName)

- (NSString *)MYCO_fabulousAddition;

@end

Если вы получаете коллизию имен методов из разных категорий, то какой из них «выигрывает» во время выполнения, полностью не определен.

Название категории почти полностью бесполезно, за исключением того, что безымянная категория (т.е. ()) зарезервирована для расширений классов. Методы из расширений класса должны быть реализованы в классе main @implementation.

3 голосов
/ 16 апреля 2011

Название категории не означает ничего особенного, это просто идентификатор.Если компоновщик (или загрузчик среды выполнения) не решит выдать вам предупреждение, невозможно сказать, что несколько категорий определяют один и тот же метод.

1 голос
/ 16 марта 2015

Он, безусловно, действует как идентификатор с точки зрения программиста. С точки зрения компилятора методы категории просто добавляются как расширение класса (из которого он расширяется) независимо от имени.

И да, вы можете добавлять категории одного и того же класса с одинаковыми идентификаторами, даже с одинаковыми функциями. Но вы определенно не можете переопределить любую функцию, потому что категории являются частью класса, как только вы их определили (точно так же, как вы не можете переопределить функцию класса из этого класса).

Поскольку они добавляются во время выполнения, они не вызывают никаких ошибок и только во время выполнения компилятор выбирает функцию, которая совершенно непредсказуема.

1 голос
/ 16 апреля 2011

Поведение (в основном) непредсказуемо - одна из категорий победит, но вы не можете сказать, какая именно. Кроме того, я думаю, что вполне возможно, что вы начнете с одной реализации и в итоге будете иметь другую (если вторая категория загружается после первой).

0 голосов
/ 16 апреля 2011

я считаю, что они не имеют никакого смысла.Вы на самом деле не используете их в своем коде ... Так как они являются категориями и ... семантикой категории ... это просто классифицировать что-то, я думаю, что это несколько логично ... Я бы сказал, что они простособери методы ...

С другой стороны, твой вопрос очень правильный ... Ты НЕ ЗНАЕШЬ, если переопределил метод.Если вы находитесь в том же проекте, то компилятор выдает предупреждение (или ошибку? Я не помню), однако, если вы переопределяете метод из библиотеки, тогда ... вам не повезло ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...