0

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

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

4

1 回答 1

3

它崩溃的原因是范围问题。你正在做的是:

  1. 创建一个新的 UIColor 对象
  2. 检索其 CGColor 指针
  3. 将该指针放入一个新变量中
  4. 释放 UIColor 对象(下一行...)
  5. 使用 CGColor 指针,它已经指向坏数据

当您在“单行版本”中执行此操作时,您所做的是:

  1. 创建一个新的 UIColor 对象
  2. 检索其 CGColor 指针
  3. 在函数中使用 CGColor 指针
  4. 释放 UIColor 对象(下一行...)

因此,因为您在使用它的同一行中创建对象,编译器会自动保留该对象,直到函数调用返回并继续执行下一行。只有这样它才会释放对象。

但是,当您将 CGColor 设置为变量时,编译器会看到该对象不会在任何地方使用,并发送释放。但是 CGColor 不是 NSObject,编译器不会向 CGColor 发送“保留”。

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

CGColorRef shadowColorRef = CGColorRetain(kCircleInnerShadowColor.CGColor);

然后当你完成它时,CGColorRelease

于 2012-05-06T15:32:05.237 回答