Iphone 如何在objective C中创建singleton类

Iphone 如何在objective C中创建singleton类,iphone,objective-c,singleton,Iphone,Objective C,Singleton,如何在Objective C中创建singleton类?查看此链接以获取原始源代码- 好的,appDev,您可能会在web上找到很多不同的技术来实现这一点。然而,对于iOS应用程序开发,我认为最方便的方法是执行以下操作: 编写获取singleton对象的方法。(建议:为此使用dispatch_oncethread和GCD) 将方法包装在宏中,并将其添加到$Project$-Prefix.pch文件中 每当需要类的单例对象时,调用单行宏 例如: CommonMacros.h: #define

如何在Objective C中创建singleton类?

查看此链接以获取原始源代码-


好的,appDev,您可能会在web上找到很多不同的技术来实现这一点。然而,对于iOS应用程序开发,我认为最方便的方法是执行以下操作:

  • 编写获取singleton对象的方法。(建议:为此使用
    dispatch_once
    thread和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;
}
您的项目前缀。pch:

...
#import "CommonMacros.h"
...
...
SINGLETON_FOR_CLASS(YourSingletonClass)
...
singletonVC.sharedMySingleton.yourFunctionName
YourSingletonClass.m:

...
#import "CommonMacros.h"
...
...
SINGLETON_FOR_CLASS(YourSingletonClass)
...
singletonVC.sharedMySingleton.yourFunctionName

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

+ (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;
}

我确实认为这就是我们真正实现单身行为的方式:

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

我知道,假定访问者知道什么是单例,但为了帮助他们不知道的人,我提出了这个简单的共享数据小示例

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

@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
@接口共享数据:NSObject{
id数据;
}
-(void)setData:(id)数据;
-(id)数据;
@结束
@实现共享数据
//>>独生子女
静态SharedData*SharedData=nil;
+(SharedData*)SharedData{
@同步(自){
如果(sharedData==nil)sharedData=[[self alloc]init];
}
返回共享数据;
}
// 试试这个

Singalton class.h文件

#import <Foundation/Foundation.h>

@interface GlobleDirector : NSObject
+(GlobleDirector*)shareManager;
@end
发件人:

Objective-C中的单身人士

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

背景

单例类是一个需要理解的重要概念,因为它们展示了一种非常有用的设计模式。这一思想贯穿于iPhone SDK,例如,UIApplication有一个名为sharedApplication的方法,当从任何地方调用该方法时,将返回与当前运行的应用程序相关的UIApplication实例

如何实施

单音.h

#import <foundation/Foundation.h>

@interface Singleton : NSObject {
}

 @property (nonatomic, retain) NSString *someProperty;

  + (id)sharedManager;

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

\import
#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;

}
@接口singt:NSObject +(id)共享管理者; @结束 #导入“singt.h” @实现信号 +(id)共享管理器 { 静态单*sharedMyManager=nil; 静态调度一次; 一次发送(一次发送)^{ sharedMyManager=[[self alloc]init]; }); 返回sharedMyManager; }
请尝试下面的代码

@implementation AppShared
static AppShared *singletonInstance;

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

swift 1.2
或更高版本中,如果类名为eg:
singletonVC

class singletonVC {

    static let sharedMySingleton = singletonVC()

    private init(){ 
    }

}
实施:

...
#import "CommonMacros.h"
...
...
SINGLETON_FOR_CLASS(YourSingletonClass)
...
singletonVC.sharedMySingleton.yourFunctionName
并添加.h

+ (id)sharedInstance;
PD:您的类应该从NSObject继承


记住,当您想使用sharedinstance时,总是调用它,而不是调用init。

这是创建singleton类的正确方法

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;
}
如何访问Anotor类中的单例类属性或方法

另一个班级


可能重复:请参阅:这很好,但缺少赋值:_sharedDataModel=[[self alloc]init]@ChuckH:self不是代表_sharedMySingleton吗?@Chandu:在上面的例子中,self不是指MySingleton类的实例,而是指MySingleton类对象。如果按原样编译,编译器将发出警告,[[self alloc]init]表达式的结果未被使用。但是,上面的示例之所以有效,是因为指向原始源的链接还包含一个alloc类方法,该方法最终完成了所需的赋值。我认为消除alloc类方法并直接使用singleton实例的alloc/init结果进行静态变量赋值要容易得多。url是不鼓励使用的过时url,因此答案应该是搜索解决方案的终点(与参考文献的另一个中途停留相比,随着时间的推移,参考文献往往会变得陈旧)请考虑在这里添加一个独立的概要,保持链接作为参考。嗨,Acharya,欢迎你这么做,谢谢你的回答。这里只有代码的答案是令人沮丧的,因为它们很难让其他人理解和学习。你认为你可以编辑你的答案来解释为什么这解决了OP的问题吗?非常感谢。我一直怀疑如果有人显式调用init会发生什么。知道如何在Swift(纯单例)中实现这一点吗。@anoop4real由于不允许显式调用init,请将init设为私有。先生,为什么类*classObj=nil;这意味着指针对象没有指向内存中的任何对象。这个静态关键字在这里到底做了什么,请解释。更多信息“nil用于表示指向Objective-C对象的空指针。nil用于表示指向Objective-C类的空指针。”所以sharedMyManager是Objective-C对象或Class对象。但我相信sharedMyManager是指向Singleton类的指针对象。如果有人显式调用init怎么办?我认为你对此无能为力,ObjC实际上没有“private”和“public”的概念。