我有一个像这样定义的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);
我没有崩溃,它工作正常。这是什么原因?
答案 0 :(得分:3)
崩溃的原因是因为范围问题。 你在做什么:
当您在“一行版本”中执行此操作时,您所做的是:
因为您在使用它的同一行中创建对象,编译器会自动保留对象,直到函数调用返回并继续到下一行。只有这样它才会释放对象。
但是当你将CGColor设置为一个变量时,会发生的事情是编译器发现该对象不会在任何地方使用,并发送一个版本。但CGColor不是NSObject,编译器不会向CGColor发送“保留”。
如果您需要变量中的CGColor,您可能需要使用 CGColorRetain 。
CGColorRef shadowColorRef = CGColorRetain(kCircleInnerShadowColor.CGColor);
然后当你完成它时, CGColorRelease