Я пытаюсь добавить свойство с именем «colorName» в UIColor, но когда я назначаю colorName для self.view.backgroundColor, значение равно NULL - PullRequest
0 голосов
/ 29 марта 2020

Мой код:

// UIColor + Theme.h

@interface UIColor (Theme)

@property (nonatomic, copy) NSString *colorName;

@end

// UIColor + Theme.m

static const void *kColorName = "colorName";

@implementation UIColor (Theme)

- (NSString *)colorName {
    return objc_getAssociatedObject(self, kColorName);
}

- (void)setColorName:(NSString *)colorName {
    objc_setAssociatedObject(self, kColorName, colorName, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

@end

// код в viewController. m

NSLog(@"%@", self.view.backgroundColor.colorName);//**print (null)**

UIColor *color1 = [UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1];
color1.colorName = @"C1";
NSLog(@"%@", color1.colorName);//**print C1**

self.view.backgroundColor = color1;
NSLog(@"%@", self.view.backgroundColor.colorName);//**print (null)**

self.view.backgroundColor.colorName = @"C1";
NSLog(@"%@", self.view.backgroundColor.colorName);//**print (null)**

UIColor *color2 = [UIColor whiteColor];
color2.colorName = @"C2"
self.view.backgroundColor = color2;
NSLog(@%@", color2.colorName);// **print C2**
NSLog(@"%@", self.view.backgroundColor.colorName);// **print C2**

Когда я использую метод, подобный [UIColor whiteColor], colorName для self.view.backgroundColor существует (адрес color1 и self.view.backgroundColor одинаков)

Но когда я использую такой метод, как [UIColor colorWithRed: green: blue: alpha:], colorName для self.view.backgroundColor будет пустым (адрес color2 и self.view.backgroundColor различаются)

Возможно, проблема в глубоком копировании O C, потому что свойство self.view.backgroundColor имеет значение (nullable, nonatomi c, copy). Как я могу дать значение self.view.backgroundColor.colorName и использовать такой метод, как [UIColor colorWithRed: green: blue: alpha:].

Может кто-нибудь мне помочь, я буду весьма признателен! Спасибо!

1 Ответ

0 голосов
/ 29 марта 2020

Проблема в том, что, за исключением предопределенных системных цветов, backgroundColor из UIView возвращает новый экземпляр каждый раз, когда вы вызываете его. Подумайте:

self.view.backgroundColor = [UIColor colorWithRed:0.1 green:0.2 blue:0.3 alpha:1];
NSLog(@"%p", self.view.backgroundColor);  // 0x60000034f440
NSLog(@"%p", self.view.backgroundColor);  // 0x600000325740

Можно ожидать, что адреса обоих будут одинаковыми, но это не так. Он ведет себя как вычисляемое свойство для пользовательских UIColor экземпляров (возможно, сгенерировано из свойства backgroundColor базового слоя, CGColorRef).

Несмотря на это, при таком поведении мы не можем использовать связанные объекты с backgroundColor из UIView.

...