iOS 使用宏打印变量名字

本文介绍了如何通过宏定义实现打印变量名称的功能,以解决KVC/KVO中硬编码可能导致的问题。通过`@#`操作符获取变量的字符串表示,并展示了在不同数据类型上的应用。同时,提出了使用block构造返回变量名的字符串,以确保在变量名变更时能及时捕获错误。
摘要由CSDN通过智能技术生成

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

比如入参一个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获得返回值.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值