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
相关产品推荐
相关产品推荐

