ios - 用于更安全的键值编码的 Justin Spahr-Summers 宏如何工作?

标签 ios objective-c

用于更安全的键值编码的 Justin Spahr-Summers 宏如何工作?

https://gist.github.com/jspahrsummers/1670404

#define ObjectKeyPath(OBJECT, KEYPATH) \
    ((void)(NO && ((void)OBJECT.KEYPATH, NO)), @ # KEYPATH )

这个子表达式的/结果有什么意义?

(NO && ((void)OBJECT.KEYPATH, NO))

这部分宏的作用是什么?

 @ # KEYPATH

最佳答案

(void)(NO && ((void)OBJECT.KEYPATH, NO))

让我们从内到外解决这个问题。

((void)OBJECT.KEYPATH, NO)

这是一个使用逗号运算符的表达式,它始终返回列表中的最后一个值。在这种情况下,最后一个值为 NO。列表中的第一项转换为对命名属性的访问。如果作为宏的第二个操作数给出的字符串是错误的,这将导致编译器错误。

接下来,此子表达式用作 bool 表达式的右侧,其第一项的计算结果始终为 false。这样做的原因是为了消除编译器关于访问 getter 的副作用的警告。这是可行的,因为编译器知道后半部分永远不会执行。

最后,在第一部分和 key 名称之间使用了一个逗号运算符。

@#KEYPATH构造一个常量NSString

关于ios - 用于更安全的键值编码的 Justin Spahr-Summers 宏如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38746384/

相关文章:

ios - iOS 中的 Crashlytics 不会继续处理 Fabric 应用程序中的 "Build Your Project"

iOS 游戏中心——频繁出现连接中断消息

ios - 与 avplayeritem 的 doesNotRecognizeSelector 一起崩溃

ios - 直接显示apns有效负载消息json格式

iphone - 如何在 iPhone App 的不同文件中为 UIAlertview 设置委托(delegate)

objective-c - iOS:角标(Badge)计数器与通知中心

ios - LocationManager.DidDetermineState 中的 HTTP 请求

iphone - UITableViewCell 未更新

objective-c - NSXMLDocument 在 Cocoa Touch 中没有 <?xml version ="1.0"encoding ="UTF-8"standalone ="no"?>

ios - NSOperation 子类性能或泄漏