You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Objective-C分类中多次调用带dispatch_once的方法会重复初始化UIColor吗

结论

多次调用GetCustomColorLightYellowBGColor方法时,dispatch_once包裹的初始化逻辑仅会执行1次,不会重复创建UIColor实例

原理说明

  • 你代码中定义的static dispatch_once_t onceToken和static UIColor *lightYellowBGColor都是静态变量,存储在全局静态内存区,变量的值会在应用整个生命周期内保留,不会随方法调用结束被销毁。
  • dispatch_once的执行逻辑完全依赖传入的onceToken状态:首次调用时会执行内部block完成初始化,同时将onceToken标记为已执行状态;后续所有调用只要检测到onceToken已标记为完成,就会直接跳过block,不会重复执行初始化代码。
  • 该实现完全符合苹果官方文档中对全局单例初始化的要求,所有调用返回的都是同一个lightYellowBGColor实例,不会产生重复创建的性能损耗,也能保证线程安全。

优化建议

当前方法是实例方法(-开头),调用时需要依赖已有的UIColor实例,建议修改为类方法(+开头),调用更便捷:

#import "UIColor+CustomColors.h"

@implementation UIColor (CustomColors)

+ (UIColor *)GetCustomColorLightYellowBGColor {
    static UIColor *lightYellowBGColor;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        lightYellowBGColor = [UIColor colorWithRed:244.0 / 255.0
                                           green:230.0 / 255.0
                                            blue:54.0 / 255.0
                                           alpha:1.0];
    });
    return lightYellowBGColor;
}

@end

修改后直接通过类调用即可:self.view.backgroundColor = [UIColor GetCustomColorLightYellowBGColor];


内容的提问来源于stack exchange,提问作者stefanosn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 03:45:02