如何实时实现singleton类



我是iOS开发的新手,我已经学习过singleton类。我理解这个概念,但对实现singleton类有疑问。任何人都可以分享使用singleton类的实时示例的源代码吗。

这就是单例类的GCD的样子。假设您创建了一个类,MySingleTonClass,它是NSObject 的子类

MySingleTonClass.h

 +(instanceType)sharedManager;
@property (nonatomic, strong) NSString *userName;

MySingleTonClass.m

+(instanceType)sharedManager{
     static MySingleTonClass *manager = nil;
     static dispatch_once_t onceToken;
     dispatch_once(&onceToken, ^{
        manager = [[MySingleTonClass alloc]init];
     });
     return manager;
}

现在您可以在ViewController.m中的其他类中调用这个singleTon类。首次导入类别

   #import MySingleTonClass.h
 -(void)viewDidLoad{
      MySingleTonClass *manager = [MySingleTonClass sharedManager];
      manager.userName = @"ABCDE";
       //manager is the singleton Object
  }

编辑

现在假设您想要访问这个相同的值。然后假设在其他ViewController中,在ViewController 之后

假设在SecondViewController.m 中

  #import "MySingleTonClass.h"
   -(void)viewDidLoad{
      MySingleTonClass *manager = [MySingleTonClass sharedManager];
      NSLog (@"%@",manager.userName);
      // This would still log ABCDE, coz you assigned it the class before, So even if you create a new object called manager here, it will return the same Manager you created before.
    manager.userName = @"Myname"; //Now the value changed to MyName untill you change it again, in the lifetime of this application.
  }

我希望我能让你理解它的概念。

如您所知,dispatch_once_t是一个GCD片段,它使其中的代码在每次运行应用程序时仅调用ONCE。您在其中编写的任何代码都将运行,或者更确切地说,在活动的应用程序的生命周期中只调用一次。

查看原始源的链接-http://getsetgames.com/2009/08/30/the-objective-c-singleton/

@implementation MySingleton
static MySingleton* _sharedMySingleton = nil;
+(MySingleton*)sharedMySingleton
{
    @synchronized([MySingleton class])
    {
        if (!_sharedMySingleton)
            [[self alloc] init];
        return _sharedMySingleton;
    }
    return nil;
}
static User *defaultUser;
+ (User *)defaultUser
{
    if (!defaultUser)
    {
        defaultUser = [self new];
        // do something...
    }

    return defaultUser;
}
There are two ways:-
1) We can create singleton class using **GCD** dispatch_once 
in this only one object will create if existing object is there then it will refer to them. 
 +(id)sharedManager 
{
    static MyManager *sharedMyManager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedMyManager = [[self alloc] init];
    });
    return sharedMyManager;
}
2) Second way is follows:-
+ (id)sharedManager {
    static MyManager *sharedMyManager = nil;
    @synchronized(self) {
        if (sharedMyManager == nil)
            sharedMyManager = [[self alloc] init];
    }
    return sharedMyManager;
}
suppose this above method is written in class **MyManager** then  u can use that  as follow       
 MyManager *sharedManager = [MyManager sharedManager];
hope this will help u.

最新更新