【问题标题】:Issue assigning custom UIColor to class property将自定义 UIColor 分配给类属性的问题
【发布时间】:2019-11-24 23:20:35
【问题描述】:

我在将自定义 UIColor 传递给我创建的方法时遇到问题。

基本上,我有一个扩展 UIButton 类的类,我可以在其中将我想要的任何颜色分配给该类的不同、通常修改的属性。为此,我经常必须将事物的颜色设置为“uiColorParameter.CGColor”或“uiColorParameter”。我的问题是,当我将自定义颜色作为参数传递时(而不是 [UIColor whiteColor](例如)我做 [UIColor colorWithRed:...],应用程序崩溃并出现错误“线程 1:EXC_BAD_ACCESS(代码= 1, 地址=0x20)”。

该类在视图控制器中使用了 2 次。

[_beginButton updateButtonBorderWithCornerRadius:10 borderWidth:2.75 borderColor:[RoundedButton appRedColor]];
[_beginButton setEventEffectsWithColor:[UIColor redColor] secondColor:[RoundedButton appRedColor]];

在自定义类 H

@property (assign) UIColor *pColor;
@property (assign) UIColor *sColor;

在自定义类中

- (void)updateButtonBorderWithCornerRadius:(CGFloat)bRadius borderWidth:(CGFloat)bWidth borderColor:(UIColor *)bColor
{
    self.layer.cornerRadius = bRadius;
    self.layer.borderWidth = bWidth;
    self.layer.borderColor = bColor.CGColor;
}

- (void)setEventEffectsWithColor:(UIColor *)fColor secondColor:(UIColor *)sColor
{
    [self setPrimaryBorderColor:fColor];
    [self setSecondaryBorderColor:sColor];

    [self addTarget:self action:@selector(highlight) forControlEvents:UIControlEventTouchDown];
    [self addTarget:self action:@selector(unhighlight) forControlEvents:UIControlEventTouchUpInside];
    [self addTarget:self action:@selector(unhighlight) forControlEvents:UIControlEventTouchDragExit];
}

- (void)highlight
{
    self.layer.borderColor = pColor.CGColor;
    self.titleLabel.textColor = pColor;
}

- (void)unhighlight
{
    self.layer.borderColor = sColor.CGColor; //Where the error occurs
    self.titleLabel.textColor = sColor;
}

- (void)setPrimaryBorderColor:(UIColor *)color
{
    pColor = color;
}

- (void)setSecondaryBorderColor:(UIColor *)color
{
    sColor = color;
}

+ (UIColor *)appRedColor
{
    return [UIColor colorWithRed:0.68 green:0.14 blue:0.09 alpha:1];
}

第一种方法“updateButtonBorder...”工作正常,没有错误。但是,对于第二种方法,无论您如何通过自定义 UIColor(是否有一个类变量,就像我所做的那样,或者作为文字 [UIColor colorWithRed:...),它都会崩溃。但是,如果我发送一个普通的 [UIColor whiteColor],例如,它会工作得很好......

【问题讨论】:

    标签: objective-c methods uicolor cgcolor


    【解决方案1】:

    由于您的 pColorsColor 属性被声明为 assign 而不是 strong,因此您遇到了内存管理问题。

    它似乎适用于系统颜色,因为这些系统颜色实例可能由 UIKit 保存在内存中。但您的自定义颜色不是。

    变化:

    @property (assign) UIColor *pColor;
    @property (assign) UIColor *sColor;
    

    到:

    @property (nonatomic, strong) UIColor *pColor;
    @property (nonatomic, strong) UIColor *sColor;
    

    您应该很少(如果有的话)将assign 与对象指针一起使用。

    【讨论】:

    • 为所有帮助干杯。在您最初发表评论后,我意识到您可能会建议我分配了错误的 var 属性,因此我刷新了每个属性的作用并通过分配属性解决了问题(与您的建议相同)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    相关资源
    最近更新 更多