我是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.