为什么使用[UIColor colorWithRed:gred:blue:alpha]会导致EXC_BAD_ACCESS?

时间:2019-03-30 12:32:59

标签: ios objective-c uiview uicolor

我创建了一个自定义UIView子类,该子类应绘制一条简单的虚线。为了定义线条的颜色,我添加了一个可检查的属性lineColor

// LineView.h
@interface LineView : UIView
@property (nonatomic,assign) IBInspectable UIColor *lineColor;
@end

// LineView.m
- (id)initWithFrame:(CGRect)frame{
    if((self = [super initWithFrame:frame])){
        [self setupView];
    }
    return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder{
    if((self = [super initWithCoder:aDecoder])){
        [self setupView];
    }
    return self;
}


- (void)setupView {
    self.lineColor = [UIColor colorWithRed:0 green:0 blue:255.0 alpha:1.0];
    //self.lineColor = [UIColor blueColor];  <-- No Problem

    [self refreshLine];
}

- (void)layoutSubviews {
    [super layoutSubviews];
    [self refreshLine];
}

- (void)refreshLine {    
    CGColorRef cgLineColor = self.lineColor.CGColor;  // <--CRASH
    ...
}
  • 如果在界面生成器中分配了颜色,则一切正常
  • 如果为默认颜色分配了[UIColor blueColor]之类的颜色,则一切正常
  • 如果像[UIColor colorWithRed:0 green:0 blue:255.0 alpha:1.0]这样的自定义颜色,应用会因EXC_BAD_ACCESS而崩溃
  

[UIDeviceRGBColor responsesToSelector:]:已发送消息到已释放实例0x6000022d08c0

这是为什么?

1 个答案:

答案 0 :(得分:4)

使用[UIColor blueColor]时,不会创建对象;您会获得对它的引用,而其他方法可以管理它的生命周期。

初始化新的UIColor对象时,您有责任确保该对象在使用时仍然有效。 “ assign”不会增加对象的引用计数; “强”确实如此。