【问题标题】:I try to add a property called "colorName" to UIColor, but when I assign colorName to self.view.backgroundColor, the value is NULL我尝试向 UIColor 添加一个名为“colorName”的属性,但是当我将 colorName 分配给 self.view.backgroundColor 时,该值为 NULL
【发布时间】:2020-03-29 02:02:54
【问题描述】:

我的代码是

//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]这样的方法时,self.view.backgroundColor的colorName是存在的。(color1和self.view.backgroundColor的地址相同)

但是当我使用[UIColor colorWithRed:green:blue:alpha:]这样的方法时,self.view.backgroundColor的colorName为空。(color2和self.view.backgroundColor的地址不同)

也许问题是关于 OC 的深拷贝,因为 self.view.backgroundColor 的属性是(可空的,非原子的,复制)。如何赋予 self.view.backgroundColor.colorName 价值并使用 [UIColor colorWithRed:green:blue:alpha:] 之类的方法。

谁能帮帮我,我将不胜感激! 谢谢!

【问题讨论】:

  • 你不应该说&kColorName吗?

标签: objective-c categories uicolor


【解决方案1】:

问题在于,除了预定义的系统颜色之外,UIViewbackgroundColor 每次调用时都会返回一个新实例。考虑:

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)。

无论如何,对于这种行为,我们不可能将关联对象与backgroundColorUIView 一起使用。

【讨论】:

  • 它适用于预定义的系统颜色,因为当您将它们与backgroundColor 结合使用时,您将获得相同的实例。 backgroundColor 显然正在对预定义的系统颜色进行一些缓存和/或特殊处理。但由于它不对其他颜色执行此操作,因此一般而言,它排除了在此上下文中关联对象的概念。
猜你喜欢
  • 2021-04-19
  • 1970-01-01
  • 2016-11-15
  • 2011-07-26
  • 2020-03-15
  • 1970-01-01
  • 2011-04-15
  • 2023-01-24
  • 2017-02-01
相关资源
最近更新 更多