菜鸟教程小白 发表于 2022-12-13 16:11:17

ios - 关于 CGColor/定义


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

<pre><code>@implementation MyClass
{
    .......
    CGColorRef myColor;
    .......
</code></pre>

<p>这里有两行 Objective C 代码:</p>

<p>第一行:</p>

<pre><code>myColor=.CGColor;
</code></pre>

<p>第二行:</p>

<pre><code>myColor=.CGColor;
</code></pre>

<p>我最初期望它们是等价的,但事实并非如此。</p>

<p>我知道它们是不等价的,因为当我使用第一个时,我的程序可以工作。当我使用第二个时,它稍后会在路上崩溃。在这里显示更多代码与问题完全无关。</p>

<p>有人能解释一下区别吗?这有望让我修改我的代码并能够使用第二行。</p>

<p>仅供引用,它崩溃了(带有:<em>线程 1:EXC_BAD_ACCESS (code=1, address=0x881b370e0)</em>):</p>

<pre><code>- (void)drawRect:(CGRect)rect
{
    .......
    CGContextSetStrokeColorWithColor(context,myColor); // Crash here !!!
    CGContextStrokeEllipseInRect(context, rectangle);
    .......
}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您正在分配给 Core Foundation 类型 <code>CGColorRef</code> 的实例变量。该类型不是 ObjC 对象类型,因此不受 ARC(自动内存管理)的约束,这意味着您需要手动管理其内存。 </p>

<p>您的两个示例实际上都不正确,但是当您分配 <code>.CGColor</code> 时最初看不到崩溃的原因是幸运的巧合:橙色对象是可能是一个长期存在的单例对象,因此它的内部 <code>CGColor</code> 引用也是长期存在的,因此您对 ivar 的分配有效,并且稍后的访问恰好有效——但这只是一个红色(橙色? ) 鲱鱼。 </p>

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

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

<pre><code>myColor = CGColorRetain(.CGColor);
</code></pre>

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

<pre><code>myColor = CGColorCreateGenericRGB(1.0, 0.5, 0.0, 1.0);
</code></pre>

<p>无论哪种情况,您现在都“拥有”这个引用,这意味着以后可以安全使用,也意味着您有责任在完成后清理它,例如:</p>

<pre><code>- (void)dealloc
{
    CGColorRelease(myColor);
}
</code></pre>

<p>另见 <a href="https://developer.apple.com/library/archive/qa/qa1565/_index.html" rel="noreferrer noopener nofollow">this Apple Tech Q&amp;A doc</a>这几乎是同一个例子。</p>

<hr/>

<p>Core Foundation 对象(<code>CGColorRef</code> 就是其中之一)所需的内存管理形式与旧的、ARC ObjC 之前的手动系统非常相似,在该系统中,您在该点增加保留计数您希望保留(“拥有”)引用的位置,然后在您不再需要它有效时减少(释放)。苹果<a href="https://developer.apple.com/library/archive/documentation/CoreFoundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html#//apple_ref/doc/uid/20001148-CJBEJBHH" rel="noreferrer noopener nofollow">has good docs</a>如何最好地考虑这一点。在这种情况下,将引用分配给您的实例变量意味着您希望它在一段时间内保持有效。通常,您在分配点保留(明确地或通过 <a href="https://developer.apple.com/library/archive/documentation/CoreFoundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html#//apple_ref/doc/uid/20001148-103029" rel="noreferrer noopener nofollow">Create function</a> 获取引用),然后在对象被释放时释放它。 </p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 关于 CGColor/定义,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/55719382/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/55719382/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 关于 CGColor/定义