【问题标题】:Can my singleton be improved?我的单身可以改善吗?
【发布时间】:2012-07-18 20:18:45
【问题描述】:

我对 iOS 5 单例有点陌生,并且正在使用此处记录的单例:

iOS 5 Singletons

类似这样的:

MyManager.h

#import <Foundation/Foundation.h>
@interface MyManager : NSObject

//Data for section 1
@property(nonatomic,copy) NSString * section1a;
@property(nonatomic, assign) NSUInteger section1b;


//Data for section 2
@property(nonatomic,copy) NSString * section2a;
@property(nonatomic, assign) NSUInteger section2b;

+ (id)sharedInstance;
@end

MyManager.m

@implementation MyManager
@synthesize section1a, section1b, section2a; , section2b;

+ (id)sharedInstance
{
    static dispatch_once_t pred = 0;
    __strong static id _sharedObject = nil;
    dispatch_once(&pred, ^{
        _sharedObject = [[self alloc] init]; // or some other init method
    });
    return _sharedObject;
}
@end

所以我使用如下:

MyManager * myManager = [MyManager sharedInstance];
myManager.data = self.data

这就是你通常使用单例的方式吗?我错过了什么吗? 对不起,我只是想确保我做对了一些基本问题。

谢谢

【问题讨论】:

  • 我不确定您在 iOS 5 或其他版本中指的是哪些差异。但我认为你错过了在 .m 文件中声明这个:static MyManager *_sharedObject = nil;
  • 只是为了你,你可以在你的单例类中实现这两个方法(除了+sharedInstance方法)+allocWithZone:+copyWithZone:,你可以添加一个static MyManager *_sharedObject;成员为你的课也是如此。 :)

标签: ios ios5 singleton


【解决方案1】:

你做得对。这是(目前 :) 可行的方法,并且可以在启用 ARC、多线程等情况下正常工作。

它不是严格意义上的单例,因为您可以分配更多的类实例,但我认为这与您的情况无关。

【讨论】:

  • 你能帮我编辑一下我的代码,让它像一个真正的单身人士一样工作吗?
  • 我实际上建议不要这样做,因为几乎没有理由这样做。您发布的代码可以正常工作。 “真正的”单例意味着摆弄手动内存管理——我很高兴这些天我很少需要这样做。 :)
【解决方案2】:

这不是单例,因为您可以使用 alloc/init 方法创建此类的多个实例。 正确答案is here

【讨论】:

  • 好吧,这行得通,但是有决心的人会使用像class_createInstance这样的运行时方法
【解决方案3】:

我通常这样制作我的单例(假设我们正在为 Manager 制作单例):

static (Manager *) instance;

+ (Manager *) getInstance
{
    if(!instance) instance = [[Manager alloc] init];
    return instance;
}

这是一个非常基本的单例(它没有考虑多线程或其他高级特性)但这是基本格式。

【讨论】:

  • 坏主意,多线程代码会比拔掉桌面上的插头更快地失败。
  • 我同意多线程代码会使这个失败;然而,他从来没有说过他想要一个线程安全的单例。我只是向他展示了简单的版本
  • @Nosrettap 单例的全部要点是一个实例。如果可以分配多个实例,那么这不是单例!
  • @RichardJ.RossIII 如果程序不使用多线程访问这个,那么只会有一个实例。
【解决方案4】:

请参考:Singleton in iOS 5? 您应该重写 allowWithZone 以防止恶意代码创建新实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 2019-02-14
    相关资源
    最近更新 更多