Класс против методов экземпляра Вызовы Obejctive-C - методы NSLocale

В любом случае, я очень зеленый нуби. Я работаю над учебником, в котором рассказывается, как использовать класс NSLocale для получения местной валюты, например:

NSLocale *here = [NSLocale currentLocale];
NSString *currency = [here objectForKey:NSLocaleCountryCode];
NSLog(@"Money is %@", currency);

Итак, я понимаю, что я создаю экземпляр класса NSLocale под названием "здесь", затем отправляю объекту "здесь" сообщение с запросом objectForKey, и результат возвращается в строку NSString, называемую "валютой". Наконец, я печатаю значение валюты с помощью NSLog.

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

NSLocale *here = [NSLocale currentLocale];
NSString *currency = [here objectForKey:NSLocaleCountryCode];
NSLog(@"Money is %@", currency);

NSArray *prefLangs = [here preferredLanguages];
NSLog(@"Preferred Languages are: %@", prefLangs);

Но это не сработало, я получил сообщение об ошибке: "Нет видимого @interface для" NSLocale ", объявляет селектор" предпочитаемый язык "

Я понял, что я должен сделать это так:

NSLocale *here = [NSLocale currentLocale];
NSString *currency = [here objectForKey:NSLocaleCountryCode];
NSLog(@"Money is %@", currency);

NSArray *prefLangs = [NSLocale preferredLanguages];
NSLog(@"Preferred Languages are: %@", prefLangs);

Я просто не понимаю, почему мне пришлось вызывать метод следующим образом: [NSLocale предпочитаемые языки], а не [здесь предпочитаемые языки]. Экземпляр 'here' уже создан выше. Может кто-нибудь, пожалуйста, объясните.

1 ответ

Решение

Вы быстро привыкнете к радости и страданиям Objective C, но короткий ответ включает в себя описание метода, которое выглядит следующим образом:

+ preferredLanguages:

"+" В объявлении указывает, что это метод класса.

Вот соответствующий параграф из документа Apple "Цель обучения C"

Класс в Objective-C может объявлять два типа методов: методы экземпляра и методы класса. Метод экземпляра - это метод, выполнение которого ограничено конкретным экземпляром класса. Другими словами, прежде чем вызывать метод экземпляра, вы должны сначала создать экземпляр класса. Методы класса, для сравнения, не требуют создания экземпляра, но об этом позже.

Если объявление начинается с "-", это делает его методом экземпляра, и вам нужно создать экземпляр (создан) для вызова методов этого объекта.

Надеюсь, это имеет смысл до сих пор.

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