最近我问到有关访问分配给自定义类的id对象的属性的问题。解决方案是使用setter / getter方法进行转换。
但是,我无法理解一件事,为什么我不能使用点语法?
比较这两行代码:
myClass.var
[myClass var]
结果是相同的,事实上,它是相似的。但是,如果你这样做:
id obj = myClass;
obj.var;
//错误 - 尝试获取值
obj.var = 5;
//错误 - 尝试设置值
它不是真正的错误消息,我只是想告诉你警告出现并且它会使构建崩溃。
但是,如果你这样做:
id obj = myClass;
[myClass setVar:5];
//没有错误 - 设置者
[myClass var];
//没有错误 - getter
没有警告,app工作正常。
这怎么可能发生?是的,我可以使用如上所述的转换或获取/设置值,但为什么点语法不起作用?
答案 0 :(得分:3)
id是“任何类型的对象”,这意味着它没有任何名为var
的属性,因此您无法使用点表示法访问它,因为var
它不是类的成员id
。
现在,如果你使用'messaging'模式[myClass var]
,你正在发送一条消息,因为在objective-c中的消息调度是一个运行时功能和动态类型,它不会在编译时抱怨,因为编译器不知道myClass
是否响应选择器var(在这种情况下'具有名为var'的属性),直到它实际上尝试将消息分派给对象。
希望它有所帮助。