为什么使用#define UIColor作为CGColorRef导致崩溃?

时间:2012-05-06 15:22:11

标签: iphone objective-c ios core-graphics

我有一个像这样定义的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);

我没有崩溃,它工作正常。这是什么原因?

1 个答案:

答案 0 :(得分:3)

崩溃的原因是因为范围问题。 你在做什么:

  1. 创建一个新的UIColor对象
  2. 检索其CGColor指针
  3. 将该指针放入新变量
  4. 释放UIColor对象(下一行......)
  5. 使用CGColor指针,该指针已指向错误数据
  6. 当您在“一行版本”中执行此操作时,您所做的是:

    1. 创建一个新的UIColor对象
    2. 检索其CGColor指针
    3. 在函数
    4. 中使用CGColor指针
    5. 释放UIColor对象(下一行......)
    6. 因为您在使用它的同一行中创建对象,编译器会自动保留对象,直到函数调用返回并继续到下一行。只有这样它才会释放对象。

      但是当你将CGColor设置为一个变量时,会发生的事情是编译器发现该对象不会在任何地方使用,并发送一个版本。但CGColor不是NSObject,编译器不会向CGColor发送“保留”。

      如果您需要变量中的CGColor,您可能需要使用 CGColorRetain

      CGColorRef shadowColorRef = CGColorRetain(kCircleInnerShadowColor.CGColor);
      

      然后当你完成它时, CGColorRelease