Почему использование [UIColor colorWithRed: gred: blue: alpha] приводит к EXC_BAD_ACCESS? - PullRequest
0 голосов
/ 30 марта 2019

Я создал собственный подкласс 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 responsedsToSelector:]: сообщение отправлено освобожденному экземпляру 0x6000022d08c0

Почему это?

1 Ответ

4 голосов
/ 30 марта 2019

Когда вы используете [UIColor blueColor], вы не создаете объект; вы получаете ссылку на него, и что-то еще управляет его жизненным циклом.

Когда вы инициируете новый объект UIColor, вы обязаны убедиться, что он по-прежнему действителен при использовании. «assign» не увеличивает количество ссылок объекта; "сильный" делает.

...