点语法和方括号语法有什么区别?

时间:2011-09-14 22:40:35

标签: objective-c

我正在通过fpr Objective-C进行一些演练,然后我到了很多地方,我抬起了眉毛。我很想让他们失望。

  1. 消息发送和方法调用有根本区别吗? Objective-C允许我同时执行这两项操作:object.message产生与[object message]相同的结果。我想可能无法使用点运算符策略创建嵌套消息?

  2. 我创建了一个NSArray对象,现在我要使用NSEnumerator打印结果:

    id myObject = [object objectEnumerator];

    在while循环中迭代并打印结果。 myObject类型id,这意味着它在运行时解析而不是编译时。我非常清楚地知道我的NSArray中存储了哪些对象 - 它们是NSString s-so,方法是将myObject的类型更改为 NSString * myObject,它运作得很好。但是,我进行了实验,发现myObject可以是任何类型,无论是NSString还是NSArray还是NSEnumerator,其中任何一种都可以正常工作,完美地迭代NSArray对象并产生相同的结果。 怎么了?

5 个答案:

答案 0 :(得分:15)

我不确定你在“消息发送”和“方法调用”之间要做出什么样的区别,因为它们有两种描述同一事物的方式。点语法只是调用getter和setter的快捷方式,即:

[foo length]
foo.length

完全相同,如下:

[foo setLength:5]
foo.length = 5

在使用getter和setter时,通常只应使用点语法;对所有其他方法调用使用方括号语法。

关于第二个问题:这就是动态类型的工作原理。您在代码中添加的任何类型声明都是编译器的提示;只要对象响应它们,Objective-C方法调用就会一直有效。

答案 1 :(得分:8)

这是面向阅读代码的人的区别。点语法表示状态(我正在访问ivar),方法语法表示行为(我正在执行某些操作)。对于运行时,两者都是相同的。

我认为Apple的目的是将访问者显示为您不必担心的实现细节。即使它们可以触发副作用(由于访问器中的一些额外代码),它们通常也不会,因此抽象不完美但值得(恕我直言)。使用点符号的另一个缺点是你不知道它背后是否有结构或联合(与消息发送不同,在分配时不会触发副作用)。也许苹果应该使用不同于点的东西。 *shrugs*

  

我想可能无法使用点运算符策略创建嵌套邮件?

点符号可用于嵌套调用,但请考虑以下内容:

shu.phyl.we.spaj.da
[[[[[shu]phyl]we]spaj]da]

在这种情况下,丑陋的越多越好。两者都是代码气味,因为一个对象正在创建与远处另一个对象的依赖关系,但是如果使用括号传递消息,则会从第二行获得更加可怕的语法,这使代码味道更容易被注意到。同样,惯例是使用点作为方法的属性和括号。

答案 2 :(得分:2)

1:您的术语不正确。点运算符不是“方法调用”,是一种不同的操作。这只是消息发送的不同视觉外观。 [x y]和x.y之间没有区别。点语法只能使用一个参数,因为它只用于属性访问。

2:对象的静态(编译时)类型对其在运行时的行为没有影响。即使您将其称为其他内容,您的对象仍然是NSEnumerator。

答案 3 :(得分:0)

1)它们都是消息发送,只是语法不同。 [object message]是传统的语法,object.message是“点符号”,但意思完全相同。您可以使用点表示法执行某些类型的嵌套,但是对于采用复杂参数的方法,您无法执行任何操作。通常,旧手Obj-C程序员除了简单的访问者调用之外不使用点表示法。 IMHO。

2)运行时非常智能,可以动态识别。指针的类型转换实际上只是编译器的一个线索,让你知道什么时候搞砸了。当消息被发送到数组以获取值时,它并不意味着(在这种情况下)。

答案 4 :(得分:0)

  1. 邮件发送是执行此操作的首选方式。它是社区使用并强化对象发送消息的概念,当你开始使用选择器并询问对象是否响应选择器(消息)时,它会在后面发挥作用。

  2. id基本上是指向任何东西的指针。它需要一些习惯,但它是Objective-C处理对象动态类型的基础。当NSLog()遇到%@格式说明符时,它会向应该替换令牌的对象发送description消息(这是在超类NSObject中实现的,可以是在子类中重写以获得所需的输出。)

  3. 将来当你这样做时,你可能会发现做这样的事情更容易:

    for (NSString *s in YourNSArrayInstance) //assuming they are NSStrings as you described
    {
        NSLog(@"%@", s);
    }
    

    甚至只是:

    for (NSString *s in YourNSArrayInstance) //assuming they are NSStrings as you described
        NSLog(@"%@", s);
    

    你最终会学会喜欢发送消息。