【问题标题】:Is It Possible to NSLog C Structs (Like CGRect or CGPoint)?是否可以使用 NSLog C 结构(如 CGRect 或 CGPoint)?
【发布时间】:2010-10-07 16:53:22
【问题描述】:

我希望能够调试 C 结构,而不必显式键入它们所包含的每个属性。

即我希望能够做这样的事情:

CGPoint cgPoint = CGPointMake(0,0);
NSLog(@"%@",cgPoint);

显然 '%@' 不起作用,因此问题。

【问题讨论】:

标签: c objective-c cocoa cocoa-touch


【解决方案1】:

你可以试试这个:

NSLog(@"%@", NSStringFromCGPoint(cgPoint));

有许多函数 provided by UIKit 可以将各种 CG 结构转换为 NSStrings。它不起作用的原因是%@ 表示一个对象。 CGPoint 是一个 C 结构(CGRects 和 CGSizes 也是如此)。

【讨论】:

  • 在 OS X 上使用 AppKit,您需要转换为 NSPoint,然后调用 NSStringFromPoint。例如:NSStringFromPoint(NSPointFromCGPoint(point))
  • NSLog(@"%@", CGRectCreateDictionaryRepresentation(rect));
  • 类似于 UI、MK、CL 前缀,虽然它们都有含义,但需要导入相应的 .h 文件,例如:UIKit、MapKit、CoreLocation; CG 前缀是否意味着我应该导入任何东西?如果不是只是一个命名约定?!
【解决方案2】:

有一些功能,如:

NSStringFromCGPoint  
NSStringFromCGSize  
NSStringFromCGRect  
NSStringFromCGAffineTransform  
NSStringFromUIEdgeInsets

一个例子:

NSLog(@"rect1: %@", NSStringFromCGRect(rect1));

【讨论】:

  • 这些是:“所有 iOS 开发中最有用但鲜为人知的单一事物”!呵呵
  • 注意:对于 Cocoa (OS X) 开发,这些函数的名称中没有“CG”。
【解决方案3】:
NSLog(@"%@", CGRectCreateDictionaryRepresentation(rect));

【讨论】:

    【解决方案4】:

    我使用以下宏来帮助我解决 NSRect:

    #define LogRect(RECT) NSLog(@"%s: (%0.0f, %0.0f) %0.0f x %0.0f",
        #RECT, RECT.origin.x, RECT.origin.y, RECT.size.width, RECT.size.height)
    

    你可以为 CGPoint 做类似的事情:

    @define LogCGPoint(POINT) NSLog(@"%s: (%0.0f, %0.0f)",
        #POINT POINT.x, POINT.y);
    

    如下使用:

    LogCGPoint(cgPoint);
    

    会产生以下结果:

    cgPoint: (100, 200)
    

    【讨论】:

    【解决方案5】:

    您可以为此使用NSValueNSValue 对象是单个 C 或 Objective-C 数据项的简单容器。它可以保存任何标量类型,例如 int、float 和 char,以及指针、结构和对象 ID。

    示例:

      CGPoint cgPoint = CGPointMake(10,30);
        NSLog(@"%@",[NSValue valueWithCGPoint:cgPoint]);
    

    输出: NSPoint: {10, 30}

    希望对你有所帮助。

    【讨论】:

      【解决方案6】:

      由于 Stack Overflow 损坏的 RSS 刚刚为我重新提出了这个问题,这是我几乎通用的解决方案:JAValueToString

      这使您可以编写 JA_DUMP(cgPoint) 并记录 cgPoint = {0, 0}

      【讨论】:

      • 我这样做了,但我得到了编译错误。有时需要属性表达式的地址或其他东西
      • @Jim Thio:宏的设置方式是,被检查的对象必须是左值。 (我不记得为什么了;否则就无法正确处理 C 字符串。)简而言之,将您的属性分配给一个临时变量,然后在其上调用 JA_DUMP。
      【解决方案7】:

      是的,您可以使用以下几个功能,例如: 首先您必须将 CGPoint 结构转换为字符串,请参见示例

      1) NSStringFromCGPoint,  
      2) NSStringFromCGSize,  
      3) NSStringFromCGRect,  
      4) NSStringFromCGAffineTransform,  
      5) NSStringFromUIEdgeInsets,
      

      例如:

      1) NSLog(@"NSStringFromCGPoint = %@", NSStringFromCGRect(cgPointValue));
      

      像这样……

      【讨论】:

        【解决方案8】:
        NSLog(@"%@",CGRectCreateDictionaryRepresentation(rect));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-17
          相关资源
          最近更新 更多