Objective-C中用类属性实现可被Swift调用的单例是否正确?
你的写法完全符合Apple官方推荐的类属性单例设计风格,和NSFileManager的defaultManager实现逻辑一致,是正确的实现方案,具体优势和合理性如下:
类属性声明符合现代语法规范
@property(class, readonly, strong) FOOMyManager *defaultManager;是Objective-C支持的类属性语法,它会自动生成+defaultManager类方法的声明,和传统手动写+ (instancetype)defaultManager;的效果完全等价,但写法更直观,更贴近“属性”的语义,也和Swift的类属性设计更接轨。线程安全的单例初始化
使用dispatch_once保证实例仅被初始化一次,这是Apple官方推荐的线程安全单例实现方式,能确保在多线程环境下不会出现多个实例的问题,完全规避了竞态条件。严格保证单例唯一性
通过- (instancetype)init NS_UNAVAILABLE;禁用了外部可调用的默认初始化方法,同时提供内部专用的initForDefaultManager方法完成实例初始化,从根本上防止外部通过alloc init创建新的实例,确保了单例的唯一性。Swift中完美适配属性访问
在Swift代码里,这个Objective-C类属性会被自动映射为Swift的类属性,你可以直接通过FOOMyManager.defaultManager(或根据Swift命名规范自动调整为FOOMyManager.default)来访问单例实例,完全满足你要求的“以属性形式访问”的需求。
对比传统的类方法声明写法,类属性的实现方式在语法上更简洁,语义上更清晰,是当前Objective-C单例设计的最优实践之一。
内容的提问来源于stack exchange,提问作者K Mehta

