You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用[UIColor colorWithRed:green:blue:alpha]为何引发EXC_BAD_ACCESS崩溃?

问题原因与解决方案

这个崩溃的核心原因很明确:你给lineColor属性用了assign修饰符,但UIColor是Objective-C对象类型,assign不会对对象进行强引用持有。

咱们拆解下三种测试场景的差异:

  • 用[UIColor blueColor]没问题:因为系统自带的这类颜色是全局单例,生命周期和App一致,不会被释放,哪怕你用assign引用,指针也始终有效。
  • Interface Builder赋值正常:IB在加载xib/storyboard时,会负责管理这些颜色对象的生命周期,确保在视图使用期间对象不会被释放。
  • 用colorWithRed:green:blue:alpha:崩溃:这个方法创建的是临时的UIDeviceRGBColor实例,在setupView方法执行完后,因为没有强引用持有它,ARC会自动释放这个对象。之后调用refreshLine时,self.lineColor已经变成了野指针,访问它的CGColor自然就触发了EXC_BAD_ACCESS。

修复方法

只需要把lineColor属性的修饰符从assign改成strong即可,让属性持有这个颜色对象:

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

修改后,ARC会帮你维护lineColor对象的生命周期,不管是系统颜色还是自定义创建的颜色,都能保证在视图需要使用它的时候不会被提前释放。

另外补充个小细节:IBInspectable对于对象类型的属性,官方推荐就是用strong修饰,避免这类内存管理问题。

内容的提问来源于stack exchange,提问作者Andrei Herford

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:36:17