gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 20:36:02 24 4
gpt4 key购买 nike

我有一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com