是否可以使用NSLog C结构(如CGRect或CGPoint)?


413

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

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

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

显然'%@'无效,因此出现了问题。


2
NSLog(@“%@”,CGRectCreateDictionaryRepresentation(rect));
Abhishek Bedi 2012年

请尝试从VTPG_Common库获取
LearnCocos2D 2013年

Answers:


806

您可以尝试以下方法:

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

UIKit提供了许多将各种CG结构转换为NSStrings 的函数。它不起作用的原因是因为它%@表示一个对象。A CGPoint是C结构(CGRects和CGSizes也是)。


7
在OS X上使用AppKit,您需要将其转换为NSPoint,然后调用NSStringFromPoint。例如:NSStringFromPoint(NSPointFromCGPoint(point))
Alex

19
NSLog(@“%@”,CGRectCreateDictionaryRepresentation(rect));
Abhishek Bedi 2012年

与UI,MK,CL前缀类似,它们都具有含义,并且需要导入相应的.h文件,例如:UIKit,MapKit,CoreLocation;CG前缀是否意味着我应该导入任何内容?如果不是,那只是命名约定吗?
Honey

231

有一些功能,例如:

NSStringFromCGPoint  
NSStringFromCGSize  
NSStringFromCGRect  
NSStringFromCGAffineTransform  
NSStringFromUIEdgeInsets

一个例子:

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

4
这些是:“在所有iOS开发中,最有用但鲜为人知的一件事情!” 嘿
Fattie

7
注意:对于Cocoa(OS X)开发,这些功能的名称中没有“ CG”。
peterflynn 2015年


13

我使用以下宏来帮助我解决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)

6
为什么不只使用内置的UIKit字符串转换函数
ma11hew28 2011年

我现在做的。这些恰好是Alex和Steve在答案中发布的功能。
e.James,2011年

1
值得编辑答案并在顶部“仅出于历史兴趣...” 添加注释。我总是这样做,例如stackoverflow.com/questions/402/iphone-app-in-landscape-mode/... stackoverflow.com/questions/5492479/... stackoverflow.com/questions/4212628/...“这是值得注意的,过去十年中的这篇文章,现在实际上只具有历史意义。”
Fattie 2014年

1
尽管存在UIKit转换功能,但该答案仍然有用,因为其他框架中还有其他结构,这些结构没有NSStringFrom帮助器(例如MKCoordinateRegion)。
格雷格·贝尔

10

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

例:

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

输出: NSPoint: {10, 30}

希望对您有帮助。


感谢@Nishant-需要输出CMTimeRange的内容,这可以解决问题。比NSStringFrom ...的可能性要大得多
2014年

5

由于Stack Overflow损坏的RSS只是为我复活了这个问题,因此这是我几乎通用的解决方案:JAValueToString

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


我这样做了,我得到了编译错误。有时属性表达式的地址需要什么
user4951

@Jim Thio:宏的设置方式是要检查的对象必须是左值。(我不记得为什么;否则,将无法正确处理C字符串。)简而言之,将属性分配给一个临时变量,然后在其上调用JA_DUMP。
詹斯·艾顿

5

是的,您可以使用下面的一些函数,例如:首先,您必须将CGPoint结构转换为字符串,请参见示例

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

例如:

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

像这样...


2
NSLog(@"%@",CGRectCreateDictionaryRepresentation(rect));
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.