在一个类中,我有一个类型为myColor的变量CGColorRef声明如下:
@implementation MyClass
{
.......
CGColorRef myColor;
.......
以下是目标C代码的两行代码:
第一行:
myColor=[UIColor orangeColor].CGColor;
第二行:
myColor=[UIColor colorWithRed:1.000 green:0.500 blue:0.000 alpha:1.000].CGColor;
我起初以为它们是等同的,但事实并非如此。
我知道它们不是等价的,因为当我使用第一个程序时,我的程序就能工作。当我使用第二种方法时,它会在随后的道路上坠毁。在这里显示更多代码与问题完全无关。
有人能解释一下这种区别吗?希望这将允许我修改我的代码并能够使用第二行。
仅供参考,它就会崩溃(使用:线程1: EXC_BAD_ACCESS (code=1,address=0x881b370e0)):
- (void)drawRect:(CGRect)rect
{
.......
CGContextSetStrokeColorWithColor(context,myColor); // Crash here !!!
CGContextStrokeEllipseInRect(context, rectangle);
.......
}
发布于 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
发布于 2019-04-17 06:08:54
您正在将Core类型的实例变量分配给CGColorRef
。该类型不是ObjC对象类型,因此不受ARC (自动内存管理)的约束,这意味着您需要手动管理其内存。
这两个示例实际上都是不正确的,但是当您指定[UIColor orangeColor].CGColor
时,您最初看不到崩溃的原因是一个幸运的巧合:橙色颜色对象可能是一个长期存在的单例对象,因此它的内部CGColor
引用也很长--因此,您对伊瓦尔工作的分配和后来的访问碰巧起作用了--但这只是一个红色(橙色?)鲱鱼。
在另一种情况下,您确实看到了崩溃,因为您在传递中创建的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);
}
还请参阅几乎相同的示例中的这个苹果科技问答公司。
(CGColorRef
是其中之一)所需的内存管理形式非常类似于旧的、预ARC ObjC手动系统,在该系统中,在希望持有(“拥有”)引用的点上增加一个保留计数,然后在不再需要它有效时减少(释放)。苹果有好的医生如何最好地思考这个问题。在这种情况下,将引用分配给实例变量意味着要在一定时间内保持它的有效性。通常,您在赋值点保留(显式地或者通过创建功能获取引用),然后在对象被释放时释放它。
https://stackoverflow.com/questions/55719382
复制相似问题