MSLibrary. ПРОСТО: объявляем глобальные переменные, для iOS и не только…

от автора

Разработчики библиотеки MSLibrary for iOS продолжают серию очень компактных статей, посвященных тому как ПРОСТО реализовать ту или иную функцию. Никакой теории, только практика…

Итак, как правильно объявить глобальные переменные?

Если мы объявим переменную в одном из заголовочных файлов, например в файле MyClass.h таким, казалось бы логичным, образом:

NSString *myGlobalVariable; 

а затем импортируем файл MyClass.h с помощью директивы #import в несколько файлов, например, MyClass1.h, MyClass2.h, MyClass3.h и MyClass4.h, то в результате с большой вероятностью получим примерно такое сообщение об ошибке:

duplicate symbol _myGlobalVariable in:     /Users/L/Library/Developer/Xcode/DerivedData/…/MyClass.o     /Users/L/Library/Developer/Xcode/DerivedData/…/MyClass1.o duplicate symbol _myGlobalVariable in:     /Users/L/Library/Developer/Xcode/DerivedData/…/MyClass.o     /Users/L/Library/Developer/Xcode/DerivedData/…/MyClass2.o duplicate symbol _myGlobalVariable in:     /Users/L/Library/Developer/Xcode/DerivedData/…/MyClass.o     /Users/L/Library/Developer/Xcode/DerivedData/…/MyClass3.o duplicate symbol _myGlobalVariable in:     /Users/L/Library/Developer/Xcode/DerivedData/…/MyClass.o     /Users/L/Library/Developer/Xcode/DerivedData/…/MyClass4.o  ld: 4 duplicate symbols for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) 

Произойдет это по тому, что в результате импорта переменная myGlobalVariable будет объявлена в каждом из подключенных файлов.

Нам надо объявить глобальную переменную таким образом, чтобы она не дублировалась ни при каких обстоятельствах. Для решения этой нехитрой задачи достаточно вспомнить что же может существовать в программе только в единственном экземпляре? Правильно, это — синглтон. Вот и ответ (как любил говорить Гамлет), глобальную переменную можно задать с помощью класса синглтон (singletone), а точнее как его свойство (property).

Паттерн Синглтон: Проверяет, что есть только один экземпляр класса и обеспечивает единую точку доступа к нему.(«Design Patterns» GoF (Addison-Wesley, 1994)).

Ниже пример кода — создаем класс сингтон, например, GlobalVariable и добавляем ему свойство myGlobalVariable, которое и будет нашей глобальной переменной:

Заголовочный файл, GlobalVariable.h

#import <Foundation/Foundation.h>;  @interface GlobalVariable : NSObject  @property(nonatomic, strong) NSString *myGlobalVariable;  +(instancetype)sharedGlobalVariable;  @end 

Файл GlobalVariable.m

#import "GlobalVariable.h"  @implementation GlobalVariable  @synthesize myGlobalVariable;  +(instancetype)sharedGlobalVariable {     static id _singletonInstance = nil;     static dispatch_once_t onceToken;     dispatch_once(&onceToken, ^{        _singletonInstance = [[super allocWithZone:NULL] init];     });    return_singletonInstance; } +(id) allocWithZone:(NSZone*)zone {     return [self sharedGlobalVariable]; } -(id) copyWithZone:(NSZone*)zone {     return self; } 

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

[GlobalVariable sharedGlobalVariable].myGlobalVariable; 

Для удобства можно использовать макрос:

#define MY_GLOBAL_VARIABLE [GlobalVariable sharedGlobalVariable].myGlobalVariable; 

Как видите вопрос решается всего в несколько простых строк кода, а при использовании библиотеки MSLibrary for iOS — объем кода уменьшится в несколько раз.


Надеемся, что материал был для вас полезен, команда MSLibrary for iOS

Другие статьи:
Захват и верификация телефонных номеров с помощью регулярных выражений, для iOS и не только… Часть 1
Захват и верификация телефонных номеров с помощью регулярных выражений, для iOS и не только… Часть 2
Реализация множественного выбора условий с помощью битовых масок, для iOS и не только…
ПРОСТО: удаляем из строки ненужные символы, используя регулярные выражения, для iOS и не только…
Создание и компиляция кроссплатформенных (универсальных) библиотек в Xcode

ссылка на оригинал статьи https://habrahabr.ru/post/282169/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *