iOS 中的单例

1.简述项目中常用的设计模式,它们都有什么优缺点?

单例模式 (Singleton Pattern)

核心概念

  • 本质 :通过静态化实例 + 私有构造函数 确保类全局唯一实例
  • 线程安全 :Swift中static let底层通过dispatch_once实现原子性初始化(iOS 10+废弃显式dispatch_once)。
Swift 复制代码
class NetworkManager {
    static let shared: NetworkManager = {
        let instance = NetworkManager()
        instance.setup() // 初始化配置
        return instance
    }()
    
    private init() {} // 禁止外部初始化
    
    func setup() {
        // 初始化网络配置
    }
}

// 使用
NetworkManager.shared.request(...)

Swift特性

  • 线程安全static let底层使用dispatch_once保证原子性初始化
  • 内存管理:单例对象在App生命周期内常驻内存
  • 防止子类化 :通过final关键字或私有构造器限制继承

Objective-C实现

OC 复制代码
// NetworkManager.h
@interface NetworkManager : NSObject
+ (instancetype)sharedInstance;
@end

// NetworkManager.m
@implementation NetworkManager
+ (instancetype)sharedInstance {
    static NetworkManager *instance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[self alloc] initPrivate];
    });
    return instance;
}

- (instancetype)initPrivate {
    self = [super init];
    if (self) {
        [self setup];
    }
    return self;
}

- (instancetype)init {
    @throw [NSException exceptionWithName:@"SingletonException"
                                   reason:@"Use +sharedInstance instead"
                                 userInfo:nil];
}
@end

// 使用
[[NetworkManager sharedInstance] request...];

Objective-C特性

  • 防御多次初始化 :通过dispatch_once保证唯一性
  • 禁止直接初始化 :重写init方法抛出异常
  • MRC兼容性:若项目未启用ARC,需手动管理内存

两种语言对比

维度 Swift Objective-C
线程安全 自动通过static let保证 需手动用dispatch_once
内存管理 ARC自动管理 需注意MRC下的retain/release
继承控制 private init()阻止子类化 通过initPrivate限制初始化
代码简洁性 更简洁(现代语法) 需更多模板代码

总结

单例: 它是用来限制一个类只能创建一个对象。这个对象中的属性可以存储全局共享的数据。所有的类都能访问、设置此单例中的属性数据。

优点: 是它只会创建一个对象容易供外界访问,节约性能。

缺点: 一个类只有一个对象,可能造成责任过重,在一定程度上违背了"单一职责原则"。单例模式中没有抽象层所以单例类的扩展有很大的困难。不能过多创建单例,因为单例从创建到程序关闭前会一直存在,过多的单例会影响性能,浪费系统资源。

相关推荐
Swift社区1 天前
使用 MetricKit 监控应用性能
ios·swiftui·swift
LawrenceMssss1 天前
由于创建一个完整的App涉及到多个层面(如前端、后端、数据库等),并且每种语言通常有其特定的用途(如Java/Kotlin用于Android开发,Swift/Objective-C用于iOS开发,Py
android·java·ios
2501_915921431 天前
如何在苹果手机上面进行抓包?iOS代理抓包,数据流抓包
android·ios·智能手机·小程序·uni-app·iphone·webview
Boyang_1 天前
在 iOS 26 上@property 的一个小 bug
ios
七牛云行业应用1 天前
iOS 19.3 突发崩溃!Gemini 3 导致 JSON 解析失败的紧急修复
人工智能·ios·swift·json解析·大模型应用
初级代码游戏1 天前
iOS开发 SwiftUI 6 :List
ios·swiftui·swift
00后程序员张1 天前
iOS APP 性能测试工具,监控CPU,实时日志输出
android·ios·小程序·https·uni-app·iphone·webview
Digitally1 天前
如何在电脑上轻松使用 iPhone 作为 U 盘
ios·电脑·iphone
2501_915921431 天前
360移动端性能监控实践QDAS-APM(iOS篇)
android·macos·ios·小程序·uni-app·cocoa·iphone
TheNextByte11 天前
如何从进水损坏的 iPhone 中恢复数据?
ios·iphone