Objective-C Правильный способ создания класса только с одним экземпляром - PullRequest
6 голосов
/ 12 октября 2010

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

В настоящее время у меня есть такой подход:

// MyClass.h

@interface MyClass : NSObject

+(MyClass *) instance;

@end

И реализация:

// MyClass.m

// static instance of MyClass
static MyClass *s_instance;

@implementation MyClass

-(id) init
{
    [self dealloc];
    [NSException raise:@"No instances allowed of type MyClass" format:@"Cannot create instance of MyClass. Use the static instance method instead."];

    return nil;
}

-(id) initInstance
{
    return [super init];
}

+(MyClass *) instance {
    if (s_instance == nil)
    {
        s_instance = [[DefaultLiteralComparator alloc] initInstance];
    }

    return s_instance;    
}

@end

Это правильный способ выполнить такую ​​задачу?

Спасибо

Ответы [ 2 ]

7 голосов
/ 12 октября 2010

Вы должны сделать немного больше, чем это. Здесь описывается, как должен быть реализован синглтон target-c: Синглтон Objective-C

0 голосов
/ 12 октября 2010

В вашем сценарии все еще есть способ создать второй экземпляр вашего класса:

MyClass *secondInstance = [[MyClass alloc] initInstance]; //we have another instance!

Вам нужно переопределить метод +(id)alloc вашего класса:

+(id)alloc{
    @synchronized(self){
        NSAssert(s_instance == nil, @"Attempted to allocate a second instance of singleton(MyClass)");
        s_instance = [super alloc];
        return s_instance;
    }
    return nil;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...