синглтон в объективе c - PullRequest
       2

синглтон в объективе c

2 голосов
/ 22 августа 2011

Я видел пример синглтона в объективной книге. Тем не менее, я не знаю, есть ли разница в значении определения «синглтон» между target-c и другими языками. Может ли этот [[SingletonClass alloc] init] все еще использоваться для создания нового объекта? Если да, как гарантировать, что в памяти есть только один объект?

#import "SingletonClass.h"

@implementation SingletonClass

static SingletonClass *sharedInstance = nil;

// Get the shared instance and create it if necessary.
+ (SingletonClass*)sharedInstance {
    if (sharedInstance == nil) {
        sharedInstance = [[super allocWithZone:NULL] init];
    }

    return sharedInstance;
}

// We can still have a regular init method, that will get called the first time the             Singleton is used.
- (id)init
{
    self = [super init];

    if (self) {
        // Work your initialising magic here as you normally would
    }

    return self;
}

Ответы [ 5 ]

8 голосов
/ 22 августа 2011

У Колина Уилера есть пост на Синглетоны в какао .

Я согласен с Колином в нежелательности синглетонов.

2 голосов
/ 22 августа 2011

Я не знаю, есть ли разница в значении определения 'singleton' между target-c и другими языками.

Это следует за общим определением языков, полученным из C.

Может ли этот [[SingletonClass alloc] init] все еще использоваться для создания нового объекта?

Да

Если да, как гарантировать, что в памяти находится только один объект?

Избегайте применения шаблона (например, не заставляйте его быть одиночным). Просто сделай нормальный предмет. Затем, если вам действительно нужен только один экземпляр, создайте его и сохраните в каком-нибудь месте для повторного использования (ваш типичный представитель приложения является для этого типичным местом, поскольку он обычно создается один раз за выполнение).

На практике большинство (> 95%) одноэлементных реализаций ObjC, которые я видел в дикой природе, используются по неправильным причинам и были бы лучше или лучше, чем обычные объекты.

Каждое решение, связанное в ответах до сих пор, имеет (как минимум) тонкие проблемы, опасности или нежелательные побочные эффекты.

2 голосов
/ 22 августа 2011

Если вам нужен настоящий синглтон, то есть объект, который может быть создан только один раз, посмотрите документацию Apple: Создание экземпляра синглтона .

По сути, идея состоит в том, чтобыпереопределить ряд методов, связанных с размещением и управлением объектами: + allocWithZone (который вызывается + alloc), -retain, -release, -copyWithZone и т. д., так что становится довольно трудно создать более одного экземпляра вашего синглтонаучебный класс.(По-прежнему возможно создать второй экземпляр, вызвав среду выполнения напрямую, но этого должно быть достаточно, чтобы понять суть.)

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

0 голосов
/ 12 января 2017

Класс Singleton используется для сохранения данных для использования в любом месте приложения.

//SingletonObject
#define saveDataSingletonObject ((SaveDataSingleton*)[SaveDataSingleton sharedManager])

@interface SaveDataSingleton : NSObject

@property (nonatomic,strong) NSMutableArray *DataArr;
+ (id)sharedManager;
-(void)clearAllSaveData;

@end

@implementation SaveDataSingleton
@synthesize DataArr;
+ (id)sharedManager {
    static SaveDataSingleton *sharedManager;
    if(!sharedManager) {
        @synchronized(sharedManager) {
            sharedManager = [SaveDataSingleton new];
        }
    }
    return sharedManager;
}
-(void)clearAllSaveData{
    DataArr=nil;
}
- (id)init {
    if (self = [super init]) {
        DataArr = [[NSMutableArray alloc]init];
    }
    return self;
}
// using setter getter save and retrieve data
+(void)setDataArr:(NSMutableArray *)Dataarr
{
    self.DataArr = [[NSMutableArray alloc]initWithArray:Dataarr];
}

+(NSMutableArray *)DataArr
{
    return self.DataArr;
}
@end

Сохранение и получение данных // Использование объекта Singleton

// save data using setter function.
[saveDataSingletonObject setDataArr:Array];
//fetch data using getter function.
NSArray *arr=[saveDataSingletonObject DataArr];
0 голосов
/ 22 августа 2011

Языковая поддержка для синглетонов отсутствует, но вы можете сделать это вручную.Посмотрите на пример синглтона здесь .Это не похоже на потокобезопасность, хотя.Я бы выделил объект в + initialize вместо + sharedManager.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...