objective-c - 在单例上实现分配

标签 objective-c ios

我希望在我的系统中有一个单例,而不是让调用者通过某种“sharedInstance”方法访问它,我希望他们能够不知道他们正在使用单例,在其他情况下话,我希望来电者能够说:

MyClass *dontKnowItsASingleton = [[MyClass alloc] init];

为了完成这个,我试过如下覆盖 alloc:

// MyClass.m

static MyClass *_sharedInstance;

+ (id)alloc {

    if (!_sharedInstance) {
        _sharedInstance = [super alloc];
    }
    return _sharedInstance;
}

我的问题是:这样可以吗?它似乎有效,但我以前从未覆盖过 alloc。另外,如果可以的话,我可以一直使用这种技术,而不是我一直在使用的 dispatch_once 方法吗? ...

+ (id)sharedInstance {

    static SnappyTV *_sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedInstance = [[self alloc] init];
    });
    return _sharedInstance;
}

最佳答案

如@H2CO3 所述,您生成单例的方法是可以接受的,但不是线程安全的。更传统的方法是将您的分配和比较包装在 @synchronized block 中,以便减少多线程访问,但是覆盖 +alloc 并不是实现的最佳方式一个已经摇摇欲坠的模式。

关于objective-c - 在单例上实现分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14006503/

相关文章:

objective-c - NSWindow 自动保存 - 位置未保存在第二台显示器上

ios - 使用 RazorPay SDK - clang : error: linker command failed with exit code 1 (use -v to see invocation)

iphone - 如何用Core Graphics制作渐变效果?

ios - iOS 中的循环视频会导致短暂的停顿/闪烁(MPMoviePlayerController 和 AVPlayer)

ios - 如何根据用户选择组合数组?

iOS 5.1 和 Default.png

ios - 调整 iOS 硬件键盘的 View 框架

ios - NSData dataWithContentsOfURL 用于相机胶卷中的 URL

iPhone Google Analytics - 识别唯一用户

ios - 在iOS 8中通过Facebook上的深层链接共享图像和文本