【问题标题】:How dispatch_once works in a category in objective c?dispatch_once 如何在目标 c 的类别中工作?
【发布时间】:2021-12-13 22:57:16
【问题描述】:

您好,我是目标 c 的新手。我在目标 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

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

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

所以我初始化了自定义 UIColor 类,然后我使用了

self.view.backgroundColor = customColorClass.CustomColorLightYellowBGColor;

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

我想问以下问题。

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

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

【问题讨论】:

    标签: ios objective-c objective-c-category


    【解决方案1】:

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

    请注意,方法名称 GetCustomColorLightYellowBGColor 确实应该只是 customColorLightYellowBGColor,它应该是类方法,而不是实例方法,因为您不需要实例化 UIColor 以使该方法工作。

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

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

    【讨论】:

    • 但是如果它是一个类方法,我将如何从主视图控制器获取方法?当我使用 self.view.backgroundColor = self.color.GetCustomColorLightYellowBGColor 时,我在“UIColor *”类型的对象上找不到属性“GetCustomColorLightYellowBGColor”
    • 找到了。您可以从另一个类调用类方法,例如 self.view.backgroundColor = [self.color WeAre8ColorLightYellowBGColor];感谢您的建议
    猜你喜欢
    • 2012-02-03
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多