使用[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
相关产品推荐
相关产品推荐

