dispatch_once 如何在 objective c 中的类别中工作?

How dispatch_once works in a category in objective c?

你好,我是 objective c 的新手。我在 objective c 中创建了一个类别。我使用 dispatch_once 来定义自定义 UIColor。

检查下面的代码。

#import "UIColor+CustomColors.h"

@implementation UIColor (CustomColors)

- (UIColor *)GetCustomColorLightYellowBGColor {

    static UIColor *lightYellowBGColor;
    
    //use dispatch_once_t pointer predicate to check if the block has finished
    //A pointer to a dispatch_once_t structure that is used to test whether the block has completed or not
    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

dispatch_once https://developer.apple.com/documentation/dispatch/1447169-dispatch_once 的文档提到以下内容

这个函数对于在应用程序中初始化全局数据(单例)很有用。在使用或测试由块初始化的任何变量之前,请始终调用此函数。

所以我初始化自定义 UIColor Class 然后我使用

self.view.backgroundColor = customColorClass.CustomColorLightYellowBGColor;

视图中的颜色正确更改,因此一切正常。

我想问一下

如果我故意再用self.view.backgroundColor = customColorClass.GetCustomColorLightYellowBGColor;

dispatch_once 会再次初始化 UIColor 还是因为单例初始化不会初始化 UIColor?任何帮助表示赞赏。

dispatch_once() 无论它在哪个编译单元中,它的工作方式都是一样的。所以,是的,它将初始化 lightYellowBGColor 恰好一次。

请注意,方法名称 GetCustomColorLightYellowBGColor 实际上应该只是 customColorLightYellowBGColor 并且它应该是 class 方法,而不是实例方法,因为您不需要实例化UIColor 使该方法起作用。

更好的是,它根本不应该是 UIColor 上的类别。虽然方便,但类别会导致代码混乱,因为您实际上将应用程序特定代码与框架代码交织在一起。

这种事情的典型模式是有一个 MyAppConfiguration class 或包含一堆方法的东西,用于检索这样的配置项。这也为允许用户通过将所有可配置项目集中在一个地方来自定义应用程序的配置 and/or 演示文稿奠定了简单的基础。