Подтвердить что ты не робот

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

Как создать одиночный класс в Objective C?

4b9b3361

Ответ 1

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

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

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

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

Пример:

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)
...

Ответ 2

Проверьте эту ссылку для исходного источника - 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;
}

Ответ 3

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

@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; метод, фактический объект формируется только один раз в течение жизненного цикла приложения.

Ответ 4

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

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

Ответ 5

Вы можете реализовать одноэлементный класс в 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/

Ответ 6

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

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

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

Фон

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

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

Singletone.h

#import <foundation/Foundation.h>

@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). Это потокобезопасно и полностью обрабатывается ОС для вас, так что вам вообще не нужно об этом беспокоиться.

Ответ 7

Попробуйте это

Файл Singalton.h file

#import <Foundation/Foundation.h>

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

Файл Singalton.m file

#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

Ответ 8

    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;
}

Ответ 9

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

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

@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 требуется только для многопоточности. Для простых экземпляров классов (ов) это не требуется.

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

Ответ 10

#import <Foundation/Foundation.h>

@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;

}

Ответ 11

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

@implementation AppShared
static AppShared *singletonInstance;

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

Ответ 12

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


static let shared = singletonVC()

private override init() {

}


вы будете называть

singletonVC.shared.yourFunctionName.