Хобрук: Ваш путь к мастерству в программировании

внешний, но статический внутренний?

Я использую MagicalRecord + CocoaLumberjack в своем проекте. Волшебная запись объявляет ddLogLevel (уровень отладки/логирования) следующим образом:

extern int ddLogLevel

так что это означает, что я должен объявить эту переменную позже сам, что я и делаю.

Теперь рассмотрим документацию Lumberjack (https://github.com/robbiehanson/CocoaLumberjack/wiki/DynamicLogLevels) Я хотел бы объявить эту переменную статической, чтобы я мог динамически изменять уровень отладки на уровне класса. Если я объявляю ddLogLevel как static int в AddDelegate, компилятор жалуется (статическое объявление следует за нестатическим объявлением), что имеет смысл, но как я должен объявить его статическим?

Единственный способ, которым я смог заставить это работать, - это объявить ddLogLevel в AppDelegate как обычный int, затем в классах, в которых я хочу иметь другой уровень журнала, я снова объявляю переменную, но только в своем интерфейсе:

@interface MyClass () {
    int ddLogLevel;
}

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


Ответы:


1

Определите ddLogLevel ровно в одном из ваших файлов .m, .c или .mm в области файлов (вне любого класса), точно так же, как это:

int ddLogLevel = 0;

Чтобы присвоить ему новое значение, используйте что-то вроде этого (внутри функции):

ddLogLevel = 2;

Не беспокойтесь о «статическом»; просто изучите основы, прежде чем пытаться что-то необычное.

27.08.2013

2

Правильный способ сделать это — объявить переменную как static, а не как extern. Я делаю это в файле .pch и добавляю прагму для подавления предупреждения:

#ifdef __OBJC__
    #import <Cocoa/Cocoa.h>
    // ...
    static int ddLogLevel = LOG_LEVEL_WARN;
    #pragma unused(ddLogLevel)
#endif

а затем, как было предложено @Quuxplusone, я могу присвоить новое значение Это:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    ddLogLevel = LOG_LEVEL_VERBOSE;
    // ...
}
20.05.2014

3

Чтобы включить динамическое изменение ddLogLevel, я использую следующий подход:

В одном заголовочном файле (.h) я определил extern DDLogLevel ddLogLevel; за пределами области @interface. В файле реализации (.m) я снова определил DDLogLevel ddLogLevel; без ключевого слова extern за пределами области @implementation. Спасибо за это, я могу динамически изменять или устанавливать ddLogLevel в любом месте.

06.01.2016
Новые материалы

Структуры данных в C ++ - Часть 1
Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..

Как я опубликовал свое первое приложение в App Store в 13 лет
Как все началось Все началось три года назад летом после моего четвертого класса в начальной школе. Для меня, четвертого класса, лето кажется бесконечным, пока оно не закончится, и мой отец..

Что в лицо
Очерк о возвращении физиогномики и о том, почему мы должны это приветствовать. История начинается со странной науки. Р. Тора Бьорнсдоттир, Николас О. Рул. Видимость социального класса по..

Почему шаблоны проектирования и почему нет?
Сложность — мать всех проблем в программировании. Программное обеспечение должно быть разработано с точки зрения того, кто его поддерживает, а не того, кто его пишет, потому что программное..

Создание дизайна обуви с помощью машинного обучения
Обувь. Что подождать? Я думал, что речь пойдет о машинном обучении! Ну это так. Если бы вы пошли на Amazon, сколько обуви вы бы нашли? Наверное, много, не так ли? Но много ли в них..

GraalVM в 2022 году: итоги года
2022 год был очень продуктивным для проекта и сообщества GraalVM. Вместе мы разработали множество новых функций, выпустили GraalVM для последних версий Java и новых платформ и увидели несколько..

Быстрая разработка: волшебный мир больших языковых моделей
РУКОВОДСТВО Быстрая разработка: волшебный мир больших языковых моделей Подход, основанный на данных, для получения наилучшего ответа Искусство и наука Можно ли совместить машинное..