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

标签 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. 创建一个新的 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

关于iphone - 为什么使用 #define UIColor 作为 CGColorRef 会导致崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10471690/

相关文章:

ios - 双击手势功能仅在第一次点击后触发,每隔一次它需要 2 次点击

objective-c - 是否有覆盖属性的模式?

android - 为什么我的代码不能在网络中的 react native 代码中运行

iphone - UIView 的弹性拖动,就像从 UITableView 顶部拖动一样

iphone - indexSetWithIndexesInRange 没有按预期进行

objective-c - 如何在 Interface Builder 中使用数学符号

python - 在python中反序列化objective-c二进制NSMutableArray

android - KeyBoardAvoidingView 隐藏内容

iphone - 该应用程序不包含有效的包标识符。

iphone - UITextField 值更改事件?