将自定义 UIColor 分配给 class 属性 的问题
Issue assigning custom UIColor to class property
我在将自定义 UIColor 传递到我创建的方法时遇到问题。
基本上,我有一个扩展 UIButton class 的 class,我可以在其中为 class 的不同的、经常修改的属性分配我想要的任何颜色。为此,我经常必须将事物的颜色设置为 "uiColorParameter.CGColor" 或 "uiColorParameter"。我的问题是,当我将自定义颜色作为参数传递时(因此,我使用 [UIColor colorWithRed:...] 而不是 [UIColor whiteColor](例如),应用程序崩溃并出现错误 "Thread 1: EXC_BAD_ACCESS (code=1, address=0x20)".
2 倍 class 在视图控制器中使用。
[_beginButton updateButtonBorderWithCornerRadius:10 borderWidth:2.75 borderColor:[RoundedButton appRedColor]];
[_beginButton setEventEffectsWithColor:[UIColor redColor] secondColor:[RoundedButton appRedColor]];
在自定义 classes H
@property (assign) UIColor *pColor;
@property (assign) UIColor *sColor;
在自定义中class
- (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(是否有一个 class 变量,就像我所做的那样,或者作为文字 [UIColor colorWithRed:...),它都会崩溃。但是,如果我发送一个普通的 [UIColor whiteColor],例如,它会工作得很好...
由于您的 pColor
和 sColor
属性被声明为 assign
而不是 strong
,因此您遇到了内存管理问题。
它似乎适用于系统颜色,因为这些系统颜色实例可能由 UIKit 保存在内存中。但是您的自定义颜色不是。
变化:
@property (assign) UIColor *pColor;
@property (assign) UIColor *sColor;
至:
@property (nonatomic, strong) UIColor *pColor;
@property (nonatomic, strong) UIColor *sColor;
您应该很少(如果有的话)将 assign
与对象指针一起使用。
我在将自定义 UIColor 传递到我创建的方法时遇到问题。
基本上,我有一个扩展 UIButton class 的 class,我可以在其中为 class 的不同的、经常修改的属性分配我想要的任何颜色。为此,我经常必须将事物的颜色设置为 "uiColorParameter.CGColor" 或 "uiColorParameter"。我的问题是,当我将自定义颜色作为参数传递时(因此,我使用 [UIColor colorWithRed:...] 而不是 [UIColor whiteColor](例如),应用程序崩溃并出现错误 "Thread 1: EXC_BAD_ACCESS (code=1, address=0x20)".
2 倍 class 在视图控制器中使用。
[_beginButton updateButtonBorderWithCornerRadius:10 borderWidth:2.75 borderColor:[RoundedButton appRedColor]];
[_beginButton setEventEffectsWithColor:[UIColor redColor] secondColor:[RoundedButton appRedColor]];
在自定义 classes H
@property (assign) UIColor *pColor;
@property (assign) UIColor *sColor;
在自定义中class
- (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(是否有一个 class 变量,就像我所做的那样,或者作为文字 [UIColor colorWithRed:...),它都会崩溃。但是,如果我发送一个普通的 [UIColor whiteColor],例如,它会工作得很好...
由于您的 pColor
和 sColor
属性被声明为 assign
而不是 strong
,因此您遇到了内存管理问题。
它似乎适用于系统颜色,因为这些系统颜色实例可能由 UIKit 保存在内存中。但是您的自定义颜色不是。
变化:
@property (assign) UIColor *pColor;
@property (assign) UIColor *sColor;
至:
@property (nonatomic, strong) UIColor *pColor;
@property (nonatomic, strong) UIColor *sColor;
您应该很少(如果有的话)将 assign
与对象指针一起使用。