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

iOS*_*Dev 40 iphone singleton objective-c

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

Joh*_*Doe 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;
}
Run Code Online (Sandbox Code Playgroud)

YourProject-Prefix.pch:

...
#import "CommonMacros.h"
...
Run Code Online (Sandbox Code Playgroud)

YourSingletonClass.m:

...
SINGLETON_FOR_CLASS(YourSingletonClass)
...
Run Code Online (Sandbox Code Playgroud)

  • http://weblog.highorderbit.com/post/11656225202/property-use-of-c-macros-for-objective-c-developers (2认同)

Sac*_*hag 27

查看此链接以获取原始来源 - 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;
}
Run Code Online (Sandbox Code Playgroud)

  • 这很好,但是失去了赋值:_sharedDataModel = [[self alloc] init]; (6认同)

Abh*_*jit 22

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

@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
Run Code Online (Sandbox Code Playgroud)

这里即使一个调用init方法而不是预期的+(id)SampleSingletonClass; 方法实际对象在整个应用程序的生命周期中只形成一次.


Chr*_*ris 12

这是我个人最喜欢的方式:

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


Amu*_*lya 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;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,不鼓励[仅链接答案](http://meta.stackoverflow.com/tags/link-only-answers/info),SO答案应该是搜索解决方案的终点(相比之下)引用的另一个中途停留,随着时间的推移往往会变得陈旧.请考虑在此处添加独立的概要,并将链接作为参考. (2认同)

Man*_*mam 6

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

Objective-C中的单身人士

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

背景

单例类是一个需要理解的重要概念,因为它们表现出非常有用的设计模式.这个想法在整个iPhone SDK中使用,例如,UIApplication有一个名为sharedApplication的方法,当从任何地方调用时,它将返回与当前运行的应用程序相关的UIApplication实例.

如何实施

Singletone.h

#import <foundation/Foundation.h>

@interface Singleton : NSObject {
}

 @property (nonatomic, retain) NSString *someProperty;

  + (id)sharedManager;

 @end
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

它的作用是定义一个名为sharedMyManager的静态变量(但只对该转换单元是全局的)),然后在sharedManager中初始化一次且仅初始化一次.我们确保仅创建一次的方式是使用Grand Central Dispatch(GCD)中的dispatch_once方法.这是线程安全的,完全由操作系统为您处理,因此您根本不必担心它.