Как создать одноэлементный class в объекте C

Как создать одноэлементный class в Objective C?

Хорошо appDev, вы, вероятно, найдете немало разных методов для этого в Интернете. Однако для разработки приложений iOS я считаю, что наиболее удобным способом является следующее:

  • Напишите свой метод (ы) для получения объекта singleton. (Рекомендация: используйте stream dispatch_once и GCD для этого).

  • Оберните свой метод (ы) в макрос и добавьте его в файл $Project$-Prefix.pch .

  • Вызовите макрос одной строки, когда вам нужен одиночный объект для classа.

Пример:

CommonMacros.h :

 #define SINGLETON_FOR_CLASS(classname) + (id) shared##classname { static dispatch_once_t pred = 0; static id _sharedObject = nil; dispatch_once(&pred, ^{ _sharedObject = [[self alloc] init]; }); return _sharedObject; } 

YourProject-Prefix.pch:

 ... #import "CommonMacros.h" ... 

YourSingletonClass.m:

 ... SINGLETON_FOR_CLASS(YourSingletonClass) ... 

Проверьте эту ссылку для исходного источника – http://getsetgames.com/2009/08/30/the-objective-c-singleton/

 @implementation MySingleton static MySingleton *_sharedMySingleton = nil; +(MySingleton *)sharedMySingleton { @synchronized([MySingleton class]) { if (!_sharedMySingleton) _sharedMySingleton = [[self alloc] init]; return _sharedMySingleton; } return nil; } 

Я действительно думаю, что мы действительно можем добиться одностороннего поведения:

 @interface SampleSingletonClass : NSObject + sharedSampleSingletonClass; @end @implementation SampleSingletonClass static SampleSingletonClass *singletonObject = nil; + (id) sharedSampleSingletonClass { if (! singletonObject) { singletonObject = [[SampleSingletonClass alloc] init]; } return singletonObject; } - (id)init { if (! singletonObject) { singletonObject = [super init]; // Uncomment the following line to see how many times is the init method of the class is called // NSLog(@"%s", __PRETTY_FUNCTION__); } return singletonObject; } @end 

Здесь даже если вы вызываете метод init вместо предполагаемого + (id) SampleSingletonClass; метод, фактический объект формируется только один раз в течение жизненного цикла приложения.

Вы можете реализовать одноэлементный class в Objective-C.

 + (id)sharedManager { static MyManager *sharedMyManager = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedMyManager = [[self alloc] init]; }); return sharedMyManager; } - (id)init { if (self = [super init]) { someProperty = [[NSString alloc] initWithString:@"Default Property Value"]; } return self; } 

http://www.galloway.me.uk/tutorials/singleton-classes/

Это мой личный любимый способ сделать это:

 + (instancetype)sharedObject { static id instance; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ instance = [[self alloc] init]; }); return instance; } 

От: http://www.galloway.me.uk/tutorials/singleton-classes/

Синглтоны в Objective-C

Одним из наиболее используемых шаблонов проектирования при разработке для iOS является одноэлементный шаблон. Это чрезвычайно эффективный способ обмена данными между различными частями кода без необходимости передавать данные вручную.

Задний план

Одиночные classы – важная концепция понимания, потому что они демонстрируют чрезвычайно полезный шаблон дизайна. Эта идея используется во всем iPhone SDK, например, UIApplication имеет метод под названием sharedApplication, который при вызове из любого места возвращает экземпляр UIApplication, относящийся к текущему запущенному приложению.

Как реализовать

Singletone.h

 #import  @interface Singleton : NSObject { } @property (nonatomic, retain) NSString *someProperty; + (id)sharedManager; @end 

Singleton.m

 #import "Singleton.h" @implementation Singleton @synthesize someProperty; #pragma mark Singleton Methods + (id)sharedManager { static Singleton *sharedMyManager = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedMyManager = [[self alloc] init]; }); return sharedMyManager; } - (id)init { if (self = [super init]) { someProperty = [[NSString alloc] initWithString:@"Default Property Value"]; } return self; } @end 

Что это значит, он определяет статическую переменную (но только глобальную для этой единицы перевода)), называемую sharedMyManager, которая затем инициализируется один раз и только один раз в sharedManager . Способ, которым мы обеспечиваем, что он создается только один раз, – это метод dispatch_once из Grand Central Dispatch (GCD) . Это streamобезопасно и полностью обрабатывается ОС для вас, так что вам вообще не нужно об этом беспокоиться.

Попробуй это

Файл .h файла Singalton

 #import  @interface GlobleDirector : NSObject +(GlobleDirector*)shareManager; @end 

Файл .m файла Singalton

 #import "GlobleDirector.h" @implementation GlobleDirector +(GlobleDirector*)shareManager{ static GlobleDirector *sharedInstance=nil; static dispatch_once_t oncePredecate; dispatch_once(&oncePredecate,^{ sharedInstance=[[GlobleDirector alloc] init]; }); return sharedInstance; } @end 
  static DBHandler* sDBHandler = nil; - (id)init { self = [super init]; if (self) { [self checkAndCreateDatabase]; } return self; } +(id)sharedDBHandler { @synchronized (self) { if (sDBHandler == nil) { sDBHandler = [self new]; } } return sDBHandler; } 

Я знаю, что предполагается, что посетители знают, что такое синглтон, но для того, чтобы помочь тем, кого они не делают, я предлагаю этот простой пример с общими данными.

Объект используется для общих экземпляров classов данных или экземпляров classа (ов).

 @interface SharedData : NSObject { id data; } - (void)setData:(id)data_; - (id)data; @end @implementation SharedData //>> singleton static SharedData *sharedData=nil; + (SharedData*)sharedData { @synchronized (self) { if (sharedData==nil) sharedData=[[self alloc]init]; } return sharedData; } //<< - (void)setData:(id)data_ { data=data_; } - (id)data { return data; } @end 

... Первый вызов (+ sharedData) создает экземпляр объекта, основываясь на его ссылке на статическую (локальную общую) переменную, которая возвращается как экземпляр ref. Следующий вызов возвращает ссылку на статическую переменную.

Данные можно установить / получить в любое время со встроенным аксессуаром.

Это приводит к относительному упрощению совместного использования объекта, но можно обрабатывать «вручную» путем обмена ссылками.

@synchronized просто требуется для многопоточности. Для простого использования экземпляров classов (ов) он не нужен.

Расширенное объяснение здесь: http://www.galloway.me.uk/tutorials/singleton-classes/

 #import  @interface singt : NSObject + (id)sharedManager; @end #import "singt.h" @implementation singt + (id)sharedManager { static singt *sharedMyManager = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedMyManager = [[self alloc] init]; }); return sharedMyManager; } 

Пожалуйста, попробуйте ввести код ниже.

 @implementation AppShared static AppShared *singletonInstance; + (AppShared*)Instance{ if (singletonInstance == nil) { singletonInstance = [[super alloc] init]; } return singletonInstance; } 

Это правильный способ создания Singleton Class

 mySingletonClass.h @interface mySingletonClass : NSObject + (mySingletonClass*)sharedInstance; @property (nonatomic, assign)BOOL useToken; mySingletonClass.m @implementation mySingletonClass static mySingletonClass *_sharedInstance = nil; + (mySingletonClass*)sharedInstance { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _sharedInstance = [[self alloc] init]; }); return _sharedInstance; } 

Как получить доступ к свойствам или методам одноэлементного classа в classе аноторов

anotherClass.m

 Bool isTokenValid = [mySingletonClass sharedInstance].useToken; 

В swift 1.2 или новее, если classname, например: singletonVC

 class singletonVC { static let sharedMySingleton = singletonVC() private init(){ } } 

Реализация:

 singletonVC.sharedMySingleton.yourFunctionName 
 + (id)sharedInstance { static dispatch_once_t pred = 0; __strong static id _sharedObject = nil; dispatch_once(&pred, ^{ _sharedObject = [[self alloc] init]; }); return _sharedObject; } - (id)init { self = [super init]; if (self) { } return self; } 

И добавьте в .h

 + (id)sharedInstance; 

PD: ваш class должен наследовать от NSObject.

Не забудьте всегда вызывать совместное использование, когда вы хотите его использовать, а не для вызова init.

  • как отобразить тестовый баннер IAd в симуляторе
  • Отправить уведомление в центр уведомлений о горном льве
  • objective-C: Как получить адрес маршрутизатора?
  • Выбор случайного объекта в NSArray
  • Воспроизведение музыки в фоновом режиме с помощью AVAudioplayer
  • Как кодировать Base64 на iPhone
  • CALayer: добавить границу только с одной стороны
  • Переменные экземпляра для объектов Objective C
  • Не удалось добавить объекты в NSMutableArray в Objective C
  • Ошибка сервера Bootstrap в Xcode IPHONE
  • Проблема с кодом: строка формата не является строковым литералом
  • Interesting Posts

    Обратный вызов, когда свойство зависимостей получает изменение xaml

    Загрузка изображения iOS через AFNetworking 2.0

    Должен ли я использовать одну или несколько настроек базы данных для многоклиентского приложения?

    Шаблон для самоотдачи и перезапуска задачи

    Как «добавить существующие frameworks» в Xcode 4?

    Как сравнивать только даты без времени в типах DateTime в Linq to SQL с Entity Framework?

    Загрузить фото в Facebook с Android Android SDK в Android

    Как сравнить две даты в Objective-C

    Запуск тестов Selenium в нескольких браузерах один за другим с C # NUnit

    Непрозрачность фона CSS с rgba не работает в IE 8

    Разница между UTC и стандартным временем GMT в .NET.

    CSS-преобразование текста используется на всех шапках

    EditText: Отключить всплывающее меню «Вставить / Заменить» в меню «Выбор текста».

    Подавление вывода windows команды функции

    У меня есть защищенный паролем USB-накопитель со скрытым разделом, как конвертировать в обычный USB-накопитель?

    Давайте будем гением компьютера.