Objective-C属性访问时点号前后空格为何不触发编译错误?
为什么Objective-C中点语法前后加空格不会触发编译错误?
嘿,这个问题问得挺到位的!其实这背后是Objective-C编译器的工作机制在起作用,咱们掰开揉碎了说:
编译器会自动忽略无关的空白字符
Objective-C属于C系语言,它的编译器在词法分析阶段会自动过滤掉空格、制表符、换行符这类空白字符——只要这些空格不会把一个完整的标识符(比如self、view)拆成两半就行。所以不管你在.前后加多少空格,编译器都会把这些空格当成“无意义的分隔符”直接跳过,只会识别出self、.、view、.、superview这些核心的语法单元。点语法本质是消息发送的语法糖
你可能早就知道,Objective-C里的点语法并不是直接访问成员变量(除非你直接操作_ivar),而是消息发送的语法糖:self.view等价于[self view](读取属性)self.view = newView等价于[self setView:newView](设置属性)
编译器处理点语法的时候,只关心.是否出现在合法的上下文里(比如对象实例之后、属性名之前),完全不会在意它前后有没有空格——毕竟空格已经被词法分析阶段清理掉了。
举个具体的例子,你提到的几种写法:
// 写法1 NSView* view = self.view. superview; // 写法2 NSView* view = self.view .superview; // 写法3 NSView * superView = self . view . superview;
编译器都会把它们转换成完全一样的消息发送代码:
NSView* view = [[self view] superview];
这种设计其实是C系语言的传统,目的是让开发者能按照自己的习惯格式化代码(比如有的人喜欢在.前后加空格提升可读性,有的人喜欢紧凑写法),不用被死板的空格规则限制,只要代码的语法逻辑是对的就行。
内容的提问来源于stack exchange,提问作者Dario JG
相关产品推荐
相关产品推荐

