gpt4 book ai didi

ios - Objective C - 使用共享实例创建单例

转载 作者:行者123 更新时间:2023-12-01 16:26:33 24 4
gpt4 key购买 nike

我对在 Objective-C/iOS 中创建单例类有疑问。
我在哪里看到在 Objective-C 中创建单例类的技巧就是这段代码

+ (id)sharedManager {
static MyManager *sharedMyManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedMyManager = [[self alloc] init];
});
return sharedMyManager;
}

每当我调用 [MyManager sharedManager]当然我得到相同的地址。但是,我也可以写 [MyManager new]在这种情况下,地址不同。

1.单例类的概念不就是将一个类的实例化限制在一个对象上吗?

2.如果我们可以创建另一个对象,它不再是单例了,是吗?

在我的 iOS 应用程序中,我尝试了 [UIApplication new] .我在运行时遇到异常。现在我明白了。您不能创建 UIApplication 的另一个实例,因为它是一个单例类。

那么为什么使用共享实例被认为是创建单例类的方式,或者我错了?

最佳答案

sharedManager是您用来访问单例实例的便捷方法。虽然这并不能保证该应用程序上只有一个该管理器的实例,但如果每个人都在使用 sharedManager那么实际上将只存在该管理器的一个实例。

这种单例是方便的单例,而不是实现。您应该使用它们,原因有很多:

  • 您可以通过调用 alloc init 对它们进行单元测试在您的单元测试中并使用该全新的分配对象
  • 如果您决定稍后重构管理器并且不再将其用作单例,如果您从乞求中将其视为与常规对象一起使用的常规对象,它会使您的生活更轻松

  • 当然,您可以通过覆盖 init 来制作单例。和 allocWithZone:要么返回唯一的实例,要么引发异常,但我不确定他们是否值得付出努力。

    Misko Hevery 在 Google clean code talks 中举办了一场关于单例的非常好的技术演讲。播放列表,视频链接: here .这种单例被称为小写 S单例,不是大写 S视频中的那些,Misko 很好地解释了为什么它们是首选。

    关于ios - Objective C - 使用共享实例创建单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34962968/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com