gpt4 book ai didi

ios - 关于 CGColor/定义

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:35:47 26 4
gpt4 key购买 nike

在一个类中,我有一个 CGColorRef 类型的变量 myColor,声明如下:

@implementation MyClass
{
.......
CGColorRef myColor;
.......

下面是两行 Objective C 代码:

第一行:

myColor=[UIColor orangeColor].CGColor;

第二行:

myColor=[UIColor colorWithRed:1.000 green:0.500 blue:0.000 alpha:1.000].CGColor;

我一开始以为它们是等价的,但它们不是。

我知道它们不等价,因为当我使用第一个时,我的程序可以运行。当我使用第二个时,它稍后会崩溃。在此处显示更多代码与问题完全无关。

谁能解释一下区别?这有望让我修改我的代码并能够使用第二行。

仅供引用,它崩溃于(with: Thread 1: EXC_BAD_ACCESS (code=1, address=0x881b370e0)):

- (void)drawRect:(CGRect)rect
{
.......
CGContextSetStrokeColorWithColor(context,myColor); // Crash here !!!
CGContextStrokeEllipseInRect(context, rectangle);
.......
}

最佳答案

您正在分配给 Core Foundation 类型 CGColorRef 的实例变量。该类型不是 ObjC 对象类型,因此不受 ARC(自动内存管理)的约束,这意味着您需要手动管理其内存。

你的两个例子实际上都是不正确的,但是你在分配 [UIColor orangeColor].CGColor 时最初没有看到崩溃的原因是一个幸运的巧合:橙色对象是可能是一个长期存在的单例对象,并且它的内部 CGColor 引用因此也是长期存在的,因此您对 ivar 的分配有效并且以后的访问恰好有效 - 但这只是一个红色(橙色? ) 鲱鱼。

在另一种情况下,您确实看到了崩溃,因为您在传递过程中创建的 UIColor 对象最终被立即释放,因为它不再被使用。因此,当您稍后尝试使用它时,您从中提取并分配给您的 ivar 的 CGColorRef 值也会立即无效并具有放射性。

要将 CGColorRef 安全地存储在您的对象中,您需要拥有它的所有权,在您的情况下,这意味着明确保留您从 UIColor 获得的 CGColorRef :

myColor = CGColorRetain([UIColor colorWithRed:1.000 green:0.500 blue:0.000 alpha:1.000].CGColor);

或者更好的做法是完全绕过 UIColor,只使用直接为您提供具有创建所有权语义的颜色引用的函数:

myColor = CGColorCreateGenericRGB(1.0, 0.5, 0.0, 1.0);

在任何一种情况下,您现在“拥有”此引用,这意味着以后可以安全使用它,也意味着您有责任在完成后清理它,例如:

- (void)dealloc 
{
CGColorRelease(myColor);
}

另见 this Apple Tech Q&A doc这几乎是同一个例子。


Core Foundation 对象(CGColorRef 是其中之一)所需的内存管理形式与旧的、ARC 之前的 ObjC 手动系统非常相似,在该系统中,您可以在该点增加保留计数您希望保留(“拥有”)引用的位置,然后在不再需要它有效时递减(释放)。苹果has good docs如何最好地考虑这一点。在这种情况下,将引用分配给您的实例变量意味着您希望它在一段时间内保持有效。通常,您会在分配点保留(明确地或通过 Create function 获取引用),然后在对象被释放时释放它。

关于ios - 关于 CGColor/定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55719382/

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