无法在 LLDB 中传递 CGColorRef 类型的参数

Posted

技术标签:

【中文标题】无法在 LLDB 中传递 CGColorRef 类型的参数【英文标题】:Can't pass parameter of type CGColorRef in LLDB 【发布时间】:2015-08-04 13:23:15 【问题描述】:

我正在扩展 Facebook 的 Chisel,以便能够可视化来自调试器的颜色。我希望它适用于 UIColorCIColorCGColorRef。这两个基于对象的工作正常,但CGColorRef 给我带来了麻烦。

Here 是我正在处理的错误,我已经从这个问题中找出了一堆东西。

我把问题归结为这个测试用例:

如果我有一些功能:

+ (UIColor *)someColor 
    UIColor *uiColor = [UIColor redColor];
    CGColorRef cgColor = uiColor.CGColor;
    UIColor *newUIColor = [UIColor colorWithCGColor:cgColor];
    return newUIColor;

我在return newUIColor; 行设置了一个断点,这就是在 LLDB 中发生的情况:

(lldb) po cgColor
<CGColor 0x7f992b626710> [<CGColorSpace 0x7f992b70d5b0> (kCGColorSpaceDeviceRGB)] ( 0 0.478431 1 1 )

(lldb) po [UIColor colorWithCGColor:cgColor]
error: cannot initialize a parameter of type 'CGColor *' with an lvalue of type 'CGColorRef' (aka 'CGColor *')
error: 1 errors parsing expression
(lldb) po [UIColor colorWithCGColor:(CGColorRef)cgColor]
error: cannot initialize a parameter of type 'CGColor *' with an rvalue of type 'CGColorRef' (aka 'CGColor *')
error: 1 errors parsing expression
(lldb) po [UIColor colorWithCGColor:(id)cgColor]
error: cannot initialize a parameter of type 'CGColor *' with an rvalue of type 'id'
error: 1 errors parsing expression
(lldb) po [UIColor colorWithCGColor:(CGColor *)cgColor]
error: use of undeclared identifier 'CGColor'
error: expected expression
error: 2 errors parsing expression
(lldb) expr @import CoreGraphics
(lldb) po [UIColor colorWithCGColor:(CGColorRef)cgColor]
error: cannot initialize a parameter of type 'CGColor *' with an rvalue of type 'CGColorRef' (aka 'CGColor *')
error: 1 errors parsing expression
(lldb) po [UIColor colorWithCGColor:(CGColor *)cgColor]
error: cannot initialize a parameter of type 'CGColor *' with an rvalue of type 'CGColor *'
error: 1 errors parsing expression
(lldb) po [UIColor colorWithCGColor:(struct CGColor *)cgColor]
error: cannot initialize a parameter of type 'CGColor *' with an rvalue of type 'struct CGColor *'
error: 1 errors parsing expression

那么,我怎样才能让lldb 执行带有CGColorRef 类型参数的行?

【问题讨论】:

【参考方案1】:

我能够使用:

(lldb) po [[UIColor alloc] initWithCGColor:cgColor]
UIDeviceRGBColorSpace 1 0 0 1

来自UIColor.h

@property(nonatomic,readonly) CGColorRef CGColor;
- (CGColorRef)CGColor NS_RETURNS_INNER_POINTER CF_RETURNS_NOT_RETAINED;

所以我相信UIColor 超出范围,.CGColor 的内存不再有效。我可能不得不复制它,但出于我的目的,使用 -initWithCGColor: 可以正常工作。

【讨论】:

以上是关于无法在 LLDB 中传递 CGColorRef 类型的参数的主要内容,如果未能解决你的问题,请参考以下文章

将 CGColorRef 作为指针存储在 NSArray 中

如何自动释放 CGColorRef

用于包含动态类的 stl 容器的 lldb C++ 调试

GDB 和 LLDB 都无法在简单的 C 文件中可靠地执行断点命令

Swift Playground 中的空类给出 __lldb_expr_ 错误

lldb - 如何杀死卡在无限循环中的命令