单例

只能共享不能复制的资源

严格实现

创建

+ (instancetype)sharedMediaData {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [[self alloc] init];
    });
    return _instance;
}

+ (id)allocWithZone:(struct _NSZone *)zone {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [super allocWithZone:zone];
    });
    return _instance;
}

- (id)copyWithZone:(NSZone *)zone {
    return _instance;
}

内存管理

- (id)retain {
    return self;
}

- (NSUInteger)retainCount {
    return NSUIntegerMax;
}

- (void)release {
    // 什么也不做
}

- (id)autorelease {
    return self;
}

子类化一个单例类

alloc调用被转发给super, 意味着如果不做修改地子类化单例,返回的实例将总是Singleton。使用一些Foundation中的函数,可以根据类的类型实例化任何对象。

// 在父类的创建方法中可以改为使用 NSAllocateObject
+ (instancetype)sharedMediaData {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [NSAllocaceObject([self class], 0, NULL) init];
    });
    return _instance;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容