带有' id'的点语法性能

时间:2015-02-03 15:22:40

标签: objective-c

最近我问到有关访问分配给自定义类的id对象的属性的问题。解决方案是使用setter / getter方法进行转换。

但是,我无法理解一件事,为什么我不能使用点语法?

比较这两行代码:

  1. myClass.var
  2. [myClass var]
  3. 结果是相同的,事实上,它是相似的。但是,如果你这样做:

    id obj = myClass;
    

    obj.var; //错误 - 尝试获取值

    obj.var = 5; //错误 - 尝试设置值

    它不是真正的错误消息,我只是想告诉你警告出现并且它会使构建崩溃。

    但是,如果你这样做:

    id obj = myClass;
    

    [myClass setVar:5]; //没有错误 - 设置者

    [myClass var]; //没有错误 - getter

    没有警告,app工作正常。

    这怎么可能发生?是的,我可以使用如上所述的转换或获取/设置值,但为什么点语法不起作用?

1 个答案:

答案 0 :(得分:3)

id是“任何类型的对象”,这意味着它没有任何名为var的属性,因此您无法使用点表示法访问它,因为var它不是类的成员id

现在,如果你使用'messaging'模式[myClass var],你正在发送一条消息,因为在objective-c中的消息调度是一个运行时功能和动态类型,它不会在编译时抱怨,因为编译器不知道myClass是否响应选择器var(在这种情况下'具有名为var'的属性),直到它实际上尝试将消息分派给对象。

希望它有所帮助。