如何在Objective C中创建单例类?
答案 0 :(得分:53)
好的appDev,您可能会在网上找到很多不同的技术。但是,对于iOS应用程序开发,我认为最方便的方法是执行以下操作:
编写获取单例对象的方法。 (建议:使用dispatch_once
线程和GCD)。
将您的方法包装在宏中并将其添加到$Project$-Prefix.pch
文件中。
每当您需要一个类的单例对象时,请调用一行宏。
示例:
<强> CommonMacros.h 强>:
#define SINGLETON_FOR_CLASS(classname)
+ (id) shared##classname {
static dispatch_once_t pred = 0;
static id _sharedObject = nil;
dispatch_once(&pred, ^{
_sharedObject = [[self alloc] init];
});
return _sharedObject;
}
<强> YourProject-Prefix.pch:强>
...
#import "CommonMacros.h"
...
<强> YourSingletonClass.m:强>
...
SINGLETON_FOR_CLASS(YourSingletonClass)
...
答案 1 :(得分:26)
查看原始来源的此链接 - http://getsetgames.com/2009/08/30/the-objective-c-singleton/
@implementation MySingleton
static MySingleton *_sharedMySingleton = nil;
+(MySingleton *)sharedMySingleton {
@synchronized([MySingleton class]) {
if (!_sharedMySingleton)
_sharedMySingleton = [[self alloc] init];
return _sharedMySingleton;
}
return nil;
}
答案 2 :(得分:19)
我认为这就是我们如何才能真正实现单身行为:
@interface SampleSingletonClass : NSObject
+ sharedSampleSingletonClass;
@end
@implementation SampleSingletonClass
static SampleSingletonClass *singletonObject = nil;
+ (id) sharedSampleSingletonClass
{
if (! singletonObject) {
singletonObject = [[SampleSingletonClass alloc] init];
}
return singletonObject;
}
- (id)init
{
if (! singletonObject) {
singletonObject = [super init];
// Uncomment the following line to see how many times is the init method of the class is called
// NSLog(@"%s", __PRETTY_FUNCTION__);
}
return singletonObject;
}
@end
这里即使一个调用init方法而不是预期的+(id)SampleSingletonClass;方法实际对象在整个应用程序的生命周期中只形成一次。
答案 3 :(得分:12)
这是我个人最喜欢的方式:
+ (instancetype)sharedObject {
static id instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[self alloc] init];
});
return instance;
}
答案 4 :(得分:11)
您可以在Objective-C中实现单例类。
+ (id)sharedManager {
static MyManager *sharedMyManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedMyManager = [[self alloc] init];
});
return sharedMyManager;
}
- (id)init {
if (self = [super init]) {
someProperty = [[NSString alloc] initWithString:@"Default Property Value"];
}
return self;
}
答案 5 :(得分:6)
来自: http://www.galloway.me.uk/tutorials/singleton-classes/
Objective-C中的单身人士
开发iOS时,我最常用的设计模式之一是单例模式。这是一种非常强大的方法,可以在代码的不同部分之间共享数据,而无需手动传递数据。
<强>背景强>
Singleton类是一个需要理解的重要概念,因为它们表现出非常有用的设计模式。这个想法在整个iPhone SDK中使用,例如,UIApplication有一个名为sharedApplication的方法,当从任何地方调用时,它将返回与当前运行的应用程序相关的UIApplication实例。
如何实施
<强> Singletone.h 强>
#import <foundation/Foundation.h>
@interface Singleton : NSObject {
}
@property (nonatomic, retain) NSString *someProperty;
+ (id)sharedManager;
@end
<强> Singleton.m 强>
#import "Singleton.h"
@implementation Singleton
@synthesize someProperty;
#pragma mark Singleton Methods
+ (id)sharedManager {
static Singleton *sharedMyManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedMyManager = [[self alloc] init];
});
return sharedMyManager;
}
- (id)init {
if (self = [super init]) {
someProperty = [[NSString alloc] initWithString:@"Default Property Value"];
}
return self;
}
@end
这样做是为了定义一个名为 sharedMyManager 的静态变量(但只对该翻译单元是全局的)),然后在 sharedManager 中初始化一次并且只进行一次。我们确保仅创建一次的方法是使用 Grand Central Dispatch(GCD)中的dispatch_once方法。这是线程安全的,完全由操作系统为您处理,因此您根本不必担心它。
答案 6 :(得分:4)
试试这个
Singleton类.h文件
#import <Foundation/Foundation.h>
@interface GlobleDirector : NSObject
+(GlobleDirector*)shareManager;
@end
Singleton类.m文件
#import "GlobleDirector.h"
@implementation GlobleDirector
+(GlobleDirector*)shareManager{
static GlobleDirector *sharedInstance=nil;
static dispatch_once_t oncePredecate;
dispatch_once(&oncePredecate,^{
sharedInstance=[[GlobleDirector alloc] init];
});
return sharedInstance;
}
@end
答案 7 :(得分:1)
static DBHandler* sDBHandler = nil;
- (id)init
{
self = [super init];
if (self) {
[self checkAndCreateDatabase];
}
return self;
}
+(id)sharedDBHandler
{
@synchronized (self) {
if (sDBHandler == nil) {
sDBHandler = [self new];
}
}
return sDBHandler;
}
答案 8 :(得分:1)
我知道假设游客知道什么是单身人士,但为了帮助他们不这样做,我提出这个简单的小例子与共享数据。
该对象用于共享数据类实例或类实例。
@interface SharedData : NSObject {
id data;
}
- (void)setData:(id)data_;
- (id)data;
@end
@implementation SharedData
//>> singleton
static SharedData *sharedData=nil;
+ (SharedData*)sharedData {
@synchronized (self) {
if (sharedData==nil) sharedData=[[self alloc]init];
}
return sharedData;
}
//<<
- (void)setData:(id)data_ {
data=data_;
}
- (id)data {
return data;
}
@end
... 第一个调用(+ sharedData)实例化该对象,该对象基于它作为实例ref返回的静态(locale shared)变量的引用。下一个调用仅返回对静态变量的引用。
可以随时使用嵌入式访问器设置/获取数据。
它导致共享对象的相对简化,但可以通过引用共享“手动”处理。
多线程只需要@synchronized。对于简单的类实例,不需要共享它。
此处有一个扩展说明:http://www.galloway.me.uk/tutorials/singleton-classes/
答案 9 :(得分:1)
#import <Foundation/Foundation.h>
@interface singt : NSObject
+ (id)sharedManager;
@end
#import "singt.h"
@implementation singt
+ (id)sharedManager
{
static singt *sharedMyManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedMyManager = [[self alloc] init];
});
return sharedMyManager;
}
答案 10 :(得分:0)
请尝试以下代码。
@implementation AppShared
static AppShared *singletonInstance;
+ (AppShared*)Instance{
if (singletonInstance == nil) {
singletonInstance = [[super alloc] init];
}
return singletonInstance;
}
答案 11 :(得分:0)
这是创建单例类
的正确方法mySingletonClass.h
@interface mySingletonClass : NSObject
+ (mySingletonClass*)sharedInstance;
@property (nonatomic, assign)BOOL useToken;
mySingletonClass.m
@implementation mySingletonClass
static mySingletonClass *_sharedInstance = nil;
+ (mySingletonClass*)sharedInstance
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedInstance = [[self alloc] init];
});
return _sharedInstance;
}
如何访问anothor类中的单例类属性或方法
anotherClass.m
Bool isTokenValid = [mySingletonClass sharedInstance].useToken;
答案 12 :(得分:-1)
在swift 1.2
或更高版本中,如果classname为eg:singletonVC
class singletonVC {
static let sharedMySingleton = singletonVC()
private init(){
}
}
<强>实施强>
singletonVC.sharedMySingleton.yourFunctionName
答案 13 :(得分:-1)
+ (id)sharedInstance {
static dispatch_once_t pred = 0;
__strong static id _sharedObject = nil;
dispatch_once(&pred, ^{
_sharedObject = [[self alloc] init];
});
return _sharedObject;
}
- (id)init {
self = [super init];
if (self) {
}
return self;
}
并添加.h
+ (id)sharedInstance;
PD:你的类应该继承自NSObject。
当您想要使用它时,请记住始终调用sharedinstance,而不是调用init。