- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在一个类中,我有一个 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/
我知道如何解决我即将概述的问题,但是,我有点困惑为什么代码场景在 iOS 模拟器中有效,但在我的 iPad 上却无效。 我有一个方法可以检查各种属性,然后根据属性的状态设置 CALayer 的背景颜色
根据 CGColor 的苹果文档: https://developer.apple.com/documentation/coregraphics/cgcolor/1455631-init 我应该可以用
我有一个黑色的 UILabel; 我正在编写以下代码来获取黑色的分量。 UIColor *aColor = [aLabel.textColor retain]; const CGFloat* comp
我在我的 Swift 应用程序中为 OS13 设置了动态 UIColor 来处理暗模式。 例如: static var background: UIColor { if #available(
这可能是您一整天看到的最愚蠢的问题,但我找不到解决方案。我有一个带边框的圆形 ImageView ,我希望边框与 Xcode 中的默认色调颜色相同,因此如果您能提供帮助,那就太好了。抱歉这个中午的问题
在一个类中,我有一个 CGColorRef 类型的变量 myColor,声明如下: @implementation MyClass { ....... CGColorRef myCol
所以看起来有一个 filed bug for swift与 CoreFoundation 类型有关。根据描述,似乎没有对 CGPath 和 CGColor 进行类型检查,下面是演示该行为的错误片段。
我使用相同颜色的两种变体(浅色和深色)来创建渐变。 代码: CAGradientLayer *gradient = [CAGradientLayer layer]; UIColor *light =
有几个问题询问有关在 Apple 平台上的颜色空间之间转换颜色的问题。不幸的是,答案通常涉及 NSColor 或 UIColor —— 无法在 OS X 和 iOS 上互换使用的不可移植的 Objec
当我初始化 CGColor 并将其转换为 UIColor 时,它不会以与使用相同值初始化的 UIColor 相同的方式呈现。如何在 CGColor 和 UIColor 之间转换并保持相同的外观? 此代
我正在尝试设置这样的属性 - -接口(interface): @property (readwrite, assign) CGColorRef otherBallColor; -一些方法: CGCol
我使用以下代码来设置 View Controller 的背景 view.wantsLayer = true let myColor = NSColor(calibratedRed: 5
关闭。这个问题需要 details or clarity 。它目前不接受答案。 想改进这个问题吗? 添加细节并通过 editing this post 澄清问题。 关闭 5 年前。 Improve
我正在尝试获取结果 CGColor(或 UIColor),它们将显示为位于顶部的两个(或更多) View 的结果彼此各有不同的颜色。显然,靠近前景的 View 的 alpha 值小于 1,从而允许后面
因此,由于函数 CGColor.copy() 返回一个可选值,人们会假设它可能有返回 nil 的原因。但是,除了 CGColor 本身是一个可选值之外,我想不出任何失败的原因。因为我在我的程序中使用它
我是 swift 和 iOS 的新手,有些事情我不知道该怎么办。 我有来自后端的颜色,我想将其转换为 CGColor "colors": [ "6909A1", "75
下面是我尝试从 UIColor 转换为 CGColor 的颜色: 001385 - R:0 G:19 B:133 ca000b - R:202 G:0 B:11 这是 Blue 与 iOS 的渲染:答
这个问题在这里已经有了答案: iOS CGColor versus UIColor (4 个答案) 关闭 4 年前。 在我的项目中,我有一组颜色。我应该使用 UIColor 作为基础类型还是 cgC
这让我感到困惑......我正在尝试为 NSColor 创建一个方便的初始化器,它从 CGColor 中创建一个,但由于某些该死的原因它只是拒绝确认 CGColor 存在!我已经导入了 Cocoa,为
我正在尝试使用 Swift 创建自定义 RGB CGColor 以用作 UIButton 的边框颜色。我尝试了以下代码,但颜色不可见: var red = UIColor(red: 100.0, gr
我是一名优秀的程序员,十分优秀!