我有一个 UIColor 定义如下:
#define kCircleInnerShadowColor [UIColor colorWithWhite:.78 alpha:1.0]
然后我这样使用它:
CGColorRef shadowColorRef = kCircleInnerShadowColor.CGColor;
CGContextSetShadowWithColor(cxt, size, 0, shadowColorRef);
但是,这会导致 BAD_ACCESS 崩溃。如果我改为这样做
CGContextSetShadowWithColor(cxt, size, 0, kCircleInnerShadowColor.CGColor);
我没有遇到崩溃,而且工作正常。这是什么原因?
最佳答案
它崩溃的原因是范围问题。 你正在做的是:
- 创建一个新的 UIColor 对象
- 检索其 CGColor 指针
- 将该指针放入一个新变量
- 释放 UIColor 对象(下一行...)
- 使用 CGColor 指针,它已经指向坏数据
当你在“一行版本”中这样做时,你所做的是:
- 创建一个新的 UIColor 对象
- 检索其 CGColor 指针
- 在函数中使用 CGColor 指针
- 释放 UIColor 对象(下一行...)
因此,因为您在使用它的同一行中创建对象,所以编译器会自动保留该对象,直到函数调用返回并继续到下一行。只有这样它才会释放对象。
但是当您将 CGColor 设置为一个变量时,编译器会发现该对象不会在任何地方使用,并发送一个释放。但是 CGColor 不是 NSObject,编译器不会向 CGColor 发送“保留”。
如果您需要在变量中使用 CGColor,您可能需要使用 CGColorRetain。
CGColorRef shadowColorRef = CGColorRetain(kCircleInnerShadowColor.CGColor);
然后当你完成它时,CGColorRelease
关于iphone - 为什么使用 #define UIColor 作为 CGColorRef 会导致崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10471690/