如何在目标C中创build单例类

我如何在Objective C中创build一个单例类?

好的appDev,你可能会发现很多不同的技术在networking上做到这一点。 但是,对于iOS应用程序开发,我认为最方便的方法是做到以下几点:

  • 编写你的方法来获取单例对象。 (build议:使用dispatch_once线程和GCD)。

  • 将你的方法包装在一个macros中,并将其添加到$Project$-Prefix.pch文件中。

  • 每当你需要一个类的单例对象时,调用一行macros。

例:

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) ... 

查看原始来源的链接 – 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; } 

我认为这是我们如何才能真正实现单身人士的行为:

 @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; 方法中,实际的对象在应用程序的整个生命周期中只形成一次。

这是我个人最喜欢的做法:

 + (instancetype)sharedObject { static id instance; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ instance = [[self alloc] init]; }); return instance; } 

你可以在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; } 

http://www.galloway.me.uk/tutorials/singleton-classes/

来自: http //www.galloway.me.uk/tutorials/singleton-classes/

Objective-C中的单例

在开发iOS时,我最常用的devise模式之一是单例模式。 这是在代码的不同部分之间共享数据的一种非常强大的方式,无需手动传递数据。

背景

单身人士class是一个重要的理解,因为他们展示了一个非常有用的devise模式。 这个想法被用在整个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 

它所做的是定义一个静态variables(但只对这个翻译单元是全局的)),称为sharedMyManager ,然后在sharedManager中只初始化一次。 我们确保只创build一次的方法是使用Grand Central Dispatch(GCD)中的dispatch_once方法。 这是线程安全的,完全由操作系统为您处理,所以你根本不用担心。

尝试这个

Singalton类.h文件

 #import <Foundation/Foundation.h> @interface GlobleDirector : NSObject +(GlobleDirector*)shareManager; @end 

Singalton类.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 
  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; } 

我知道游客知道什么是单身人士,但为了帮助他们不这样做,我提出这个简单的小例子,共享数据。

该对象用于共享数据类实例或类实例。

 @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)实例化基于对静态(locale共享)variables的引用的对象,它作为实例ref返回。 下一次调用只返回对静态variables的引用。

数据可以随时通过embedded式访问器设置/获取。

它可以相对简化地共享一个对象,但可以通过引用共享“手动”处理。

multithreading只需要@synchronized。 对于简单的类(es)实例共享它是不需要的。

一个扩展的解释在这里: http : //www.galloway.me.uk/tutorials/singleton-classes/

 #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; } 

请尝试下面的代码。

 @implementation AppShared static AppShared *singletonInstance; + (AppShared*)Instance{ if (singletonInstance == nil) { singletonInstance = [[super alloc] init]; } return singletonInstance; } 

在swift中,如果classname是例如:singletonVC


static let shared = singletonVC()

私人重写init(){

}


你会打电话给

singletonVC.shared.yourFunctionName。