如何在目标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/
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。