首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >关于CGColor/definition

关于CGColor/definition
EN

Stack Overflow用户
提问于 2019-04-17 03:20:18
回答 2查看 288关注 0票数 2

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

代码语言:javascript
运行
复制
@implementation MyClass
{
    .......
    CGColorRef myColor;
    .......

以下是目标C代码的两行代码:

第一行:

代码语言:javascript
运行
复制
myColor=[UIColor orangeColor].CGColor;

第二行:

代码语言:javascript
运行
复制
myColor=[UIColor colorWithRed:1.000 green:0.500 blue:0.000 alpha:1.000].CGColor;

我起初以为它们是等同的,但事实并非如此。

我知道它们不是等价的,因为当我使用第一个程序时,我的程序就能工作。当我使用第二种方法时,它会在随后的道路上坠毁。在这里显示更多代码与问题完全无关。

有人能解释一下这种区别吗?希望这将允许我修改我的代码并能够使用第二行。

仅供参考,它就会崩溃(使用:线程1: EXC_BAD_ACCESS (code=1,address=0x881b370e0)):

代码语言:javascript
运行
复制
- (void)drawRect:(CGRect)rect
{
    .......
    CGContextSetStrokeColorWithColor(context,myColor); // Crash here !!!
    CGContextStrokeEllipseInRect(context, rectangle);
    .......
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-17 04:41:07

崩溃是因为您可能没有myColor对象的强引用(属性)。您可能具有assign属性

[UIColor orangeColor]工作的原因而不是[UIColor colorWithRed...

当您使用UIColor orangeColor时,您不创建对象;您得到了对它的引用,并且有其他东西管理它的生命周期。

当您插入一个新的UIColor对象时,您负责确保它在使用时仍然有效。"assign“不会增加对象的引用计数;"strong”会增加引用计数。

希望能帮上忙

编辑

像这样的一处房产

@property (nonatomic,strong) UIColor * myUIColor;

现在当你可以

像这样做

myUIColor =[UIColor colorWithRed:1.000 green:0.500 blue:0.000 alpha:1.000]

当你需要CGColor时

myUIColor. CGColor

票数 1
EN

Stack Overflow用户

发布于 2019-04-17 06:08:54

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

这两个示例实际上都是不正确的,但是当您指定[UIColor orangeColor].CGColor时,您最初看不到崩溃的原因是一个幸运的巧合:橙色颜色对象可能是一个长期存在的单例对象,因此它的内部CGColor引用也很长--因此,您对伊瓦尔工作的分配和后来的访问碰巧起作用了--但这只是一个红色(橙色?)鲱鱼。

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

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

代码语言:javascript
运行
复制
myColor = CGColorRetain([UIColor colorWithRed:1.000 green:0.500 blue:0.000 alpha:1.000].CGColor);

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

代码语言:javascript
运行
复制
myColor = CGColorCreateGenericRGB(1.0, 0.5, 0.0, 1.0);

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

代码语言:javascript
运行
复制
- (void)dealloc 
{
    CGColorRelease(myColor);
}

还请参阅几乎相同的示例中的这个苹果科技问答公司

(CGColorRef是其中之一)所需的内存管理形式非常类似于旧的、预ARC ObjC手动系统,在该系统中,在希望持有(“拥有”)引用的点上增加一个保留计数,然后在不再需要它有效时减少(释放)。苹果有好的医生如何最好地思考这个问题。在这种情况下,将引用分配给实例变量意味着要在一定时间内保持它的有效性。通常,您在赋值点保留(显式地或者通过创建功能获取引用),然后在对象被释放时释放它。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55719382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档