ios - 静态变量如何在实例方法中工作 - 单例

标签 ios objective-c oop singleton

我遵循了一个教程来实现 Singleton 并且它工作正常。下面是代码:

@implementation DKSingle

static DKSingle *dKSingle = nil;

+(id)dKSingleInstance{

    if (!dKSingle) {
        dKSingle = [[DKSingle alloc]init];
    }
    return dKSingle;
}


-(id)init{

    if (!dKSingle) {
        dKSingle = [super init];
    }
    return dKSingle;
}

@end

我的问题是 dKSingle 是一个静态变量,那么它如何在即时方法中工作 在里面 。请帮助我理解。

最佳答案

静态变量是存储在所谓的“静态”存储器中的变量,该存储器在应用程序启动时分配并在应用程序的生命周期内存在。在 objective-c 中,它们不是类的一部分,但它们的可访问性仅限于定义变量的位置。此外,它们与实例变量的不同之处在于整个应用程序只有一个实例,而不是每个创建的对象一个。

通常,在 Objective-C 中定义单例模式的更好方法是这样的:

+ (instancetype)dKSingleInstance {
    static DKSingle* dKSingle;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        dKSingle = [[DKSingle alloc]init];
    });
    return dKSingle;
}

这使得静态变量的范围仅限于一个方法。此外,通过使用 dispatch_once,您可以为初始化静态变量提供一些线程安全性。

关于ios - 静态变量如何在实例方法中工作 - 单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24308699/

相关文章:

iphone - 如何从 iOS 中的 FTP URL 在 ImageView 上加载图像

objective-c - 循环缓冲录音iOS : Possible?

ios - 弹出框不显示内容

ios - 如何在 Xcode 6 的 iOS 中使用 Storyboard执行 self.view.frame.size.width?

ios - [Objective-C]在不隐藏键盘的情况下编辑 UILabel

java - 什么是脆弱的基类问题?

oop - 成员变量和局部变量有什么区别?

iOS 8 从 iTunesConnect 中的审核中删除构建

ios - iPod 和 iPhone 之间的区别?在 APNS 中

java - 对Java中继承方法和字段的困惑