2013-04-01 3 views
-1

Я создал ни одной тонны, как это для АРК,Проблемы с одноплодной

+ (MyClass *)sharedInstance { 
    static MyClass *sharedSpeaker = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedSpeaker = [[self alloc] init]; 
    }); 
    return sharedSpeaker; 
} 

- (id)init { 
    if (self = [super init]) { 

    } 
    return self; 
} 

Но здесь я создаю экземпляры, как это:

id speaker3 = [[MyClass alloc] init]; 
id speaker = [MyClass sharedInstance]; 
id speaker2 = [[MyClass alloc] init]; 
NSLog(@"Speaker 1= %@ \n speaker 2 = %@\n Speaker3 = %@",speaker,speaker2,speaker3);` 

Я получил выход как:

Speaker 1= <MyClass : 0xa45f5e0> 
speaker 2 = <MyClass : 0xa461740> 
Speaker3 = <MyClass : 0xa4529e0> 

Это похоже на желаемое поведение. Как остановить это, когда я даю singleton в библиотеке пользователю. Мне нужно заблокировать его от создания нового экземпляра. Мне нужно сделать статический глобальный, если я сделаю его глобальным, он не сможет создать глобальную переменную с тем же именем, что и конфликт будет правильным. Так что любые члены могут дать решение?

+0

одной тонны не требуется в itialize с помощью init в проекте, чтобы получить доступ к своему экземпляру, вам нужно только вызвать его метод класса. если вы инициализируете его извне, то он будет возвращать новый экземпляр все время, если вы хотите создать объект, то какая цель singleton ?? –

+0

Обратите внимание, что даже если вы отключите init, вы не можете принудительно применять одноэлементное поведение в Objective-C, так как пользователь всегда может создавать больше экземпляров с использованием 'NSAllocateObject()' и 'class_createInstance()'. – Jano

+0

Я не знаю, почему я получил понижение до этого. Фактически, новичок, который использует мою библиотеку, может создать инициализацию alloc объекта ... И если я использую глобальную переменную и проверяю ее во время метода init для создания объекта, тогда конфликт глобальной переменной имен появляется, если кто-то хочет создать переменную с тем же именем. Я просто хотел проверить с лучшими людьми, чтобы получить хорошие решения для этого ... Я не знаю, какой мозговой вопрос понижен ... – Star

ответ

0

Поскольку вы создаете новые экземпляры своего одноэлементного класса, используя alloc, init.

Вы получите экземпляр singleton, используя метод класса sharedInstance. как:

id speaker = [MyClass sharedInstance]; 

Если вы не хотите создавать экземпляры с alloc или init. Переопределите эти методы.

Вы можете написать static MyClass *sharedSpeaker = nil; как статическую глобальную переменную и удалить ее из метода sharedInstance.

+0

Я сказал это в своем вопросе ... Также я сказал, что эта переменная блокирует разработчика при создании другая переменная с тем же именем ... как разрешить этот конфликт ... – Star

3

Например, используя утверждение в методе init.

- (id)init { 
    static int maxInstances = 1; 

    assert(maxInstances > 0); 

    maxInstances--; 

    ... 
} 
+0

Исключения должны быть фатальными. Это излишество. – CodaFi

+0

Будет ли, пожалуйста, объясните больше, я сожалею, что не понял этого ... – Star

+0

Это очень просто. Метод 'init' позволит вам создать только один экземпляр.Это означает, что если создается 'sharedInstance', никакой другой экземпляр не может быть создан (через' init'). Это не идеальное решение, но, вероятно, это лучшее, что вы можете сделать. – Sulthan

0

в файле .h

#import <Foundation/Foundation.h> 

    @interface Singleton : NSObject 
    { 
      ///...... 
    } 

    + (Singleton *)sharedSingleton; 

в .m файл

#import "Singleton.h" 

    @implementation Singleton 
    static Singleton *singletonObj = NULL; 

    + (Singleton *)sharedSingleton 
    { 
      @synchronized(self) 
      { 
        if (singletonObj == NULL) 
          singletonObj = [[self alloc] init]; 
      } 
      return(singletonObj); 
    } 

и использовать это в другом файле

#import "Singleton.h" 
    //..... 

    Singleton *sinObj = [Singleton sharedSingleton]; // not alloc and init. use direct 
+0

Я сделал это ... Ват, если новый парень, который не знает, использовать Singleton сделал Singleton alloc init ?? ? Я хочу остановить это также ... – Star

0
create instance like this it will always return you singlton 

static testSinglton *myinstance = nil; 
+ (testSinglton *) sharedInstance { 
    if (!myinstance) { 
     myinstance = [[testSinglton alloc] init]; 
    } 
    return myinstance; 
} 

- (id) init { 

    if (myinstance) { 
     return myinstance; 
    } 
    if (self = [super init]) { 
     //new object now will be created... 
     myinstance = self; 
    } 
    return self; 
} 

NSLog(@"%@",[[testSinglton alloc] init]); 
NSLog(@"%@",[testSinglton sharedInstance]); 
NSLog(@"%@",[[testSinglton alloc] init]); 
+0

Как сделать этот + (testSinglton *) sharedInstance потоком безопасным. Что делать, если две метрики называют это api в то же время в разных CPU. ??? – Star

Смежные вопросы