iOS 使用宏打印变量名字

Posted 想名真难

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 使用宏打印变量名字相关的知识,希望对你有一定的参考价值。

今天看代码发现一个宏, 竟然还是有点意思的.  这个宏可以把入参的变量名称打印出来,

比如入参一个string类型的字符串, 变量名叫 studentName = @"小明", 通过这个宏可以打印出studentName.

#define HTLog(_var) \\
 \\
    NSString *name = @#_var; \\
    NSLog(@"变量名:%@; 变量值:%@; 变量地址:%p; 变量类型:%@", name, _var, _var, [_var class]); \\


// -----------------

NSString *studentName = @"小明";
HTLog(studentName);
控制台输出: 
变量名:studentName; 变量值:小明; 变量地址:0x10cf2f340; 变量类型:__NSCFConstantString

NSNumber *number1 = @1;
HTLog(number1);
控制台输出: 
变量名:number1; 变量值:1; 变量地址:0xb000000000000012; 变量类型:__NSCFNumber

为什么经过@#之后就可以获取到变量名称了??  我在代码中直接写@#就要给我报错了, 看来问题可能出在是宏的原因.

一个 # 号
表示加双引号

#define kToString(x) #x

kToString(123) 等价于 "123"

显然,这个一个C字符串

要想变成OC的字符串

还需要改进一下:

#define kToString(x) @#x

两个 ## 号
表示连接
#define kConnect(x,y) x##y

kConnect(123,456) 等价于 123456

这个在看MAS源码的时候看到了一个具体的例子

 

好了, 有了这些奇怪的知识, 就可以做到传入一个变量, 打印出变量对应的名字. 

比如在KVC/KVO的时候 需要使用字符串做一些硬编码, 后期修改变量名可能会导致KVC/KVO失效, 而使用这样获取字符串, 如果发生修改变量名, 编译器会直接报错, 提前发现硬编码导致的问题.

#define GCSToString(_var) \\
(NSString *)^(void) \\
    NSString *name = @#_var; \\
    return name;\\
()

#define GCSVarToStringAndValue(_var) \\
(NSString *)^(void) \\
    NSString *name = @#_var; \\
    name = [name stringByAppendingFormat:@":%@",_var];\\
    return name;\\
()


// -------

NSString *key = GCSToString(studentName);
NSLog(@"%@",key);
控制台输出:
studentName

构造了一个block, 返回值是一个NSString,  然后立即调用这个block获得返回值.

以上是关于iOS 使用宏打印变量名字的主要内容,如果未能解决你的问题,请参考以下文章

iOS宏定义介绍

请教高手们,宏定义的变量的值能printf出来吗

开发常用宏 - iOS

使用 DEBUG 宏屏蔽调试信息

iOS中打印系统详细日志

SAS中的宏变量开头和结尾分别是啥命令?