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

时间:2011-03-21 17:07:33

标签: iphone objective-c singleton

如何在Objective C中创建单例类?

14 个答案:

答案 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;
}

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

答案 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。