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

Par*_*lia 14 objective-c

我正在经历一些fpr Objective-C的演练,我到了很多地方,我抬起了眉毛.我很想让他们失望.

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

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

    id myObject = [object objectEnumerator];

    在while循环中迭代和打印结果.该类型myObject就是id,这意味着它在运行时解决,而不是编译时间.我非常清楚地知道什么样的对象存储在我的NSArray- 他们是NSStrings-so通过改变myObjectto 的类型NSString * myObject,它工作得很好.然而,我进行了实验,发现它myObject可以是任何类型,无论是它NSString还是NSArray或者NSEnumerator,这些都可以正常工作,完美地迭代NSArray对象并产生相同的结果.那是怎么回事?

Jim*_*uls 15

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

[foo length]
foo.length
Run Code Online (Sandbox Code Playgroud)

是完全一样的,如:

[foo setLength:5]
foo.length = 5
Run Code Online (Sandbox Code Playgroud)

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

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


Jan*_*ano 8

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

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

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

点表示法可用于嵌套调用,但请考虑以下内容:

shu.phyl.we.spaj.da
[[[[[shu]phyl]we]spaj]da]
Run Code Online (Sandbox Code Playgroud)

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


Fly*_*ver 0

1)它们都是消息发送,只是语法不同。[object message] 是传统语法,object.message 是“点符号”,但含义完全相同。您可以使用点表示法进行某些类型的嵌套,但无法使用采用复杂参数的方法执行任何操作。一般来说,老手 Obj-C 程序员除了简单的访问器调用外不使用点表示法。恕我直言。

2)运行时非常智能,可以即时计算出来。指针的类型转换实际上只是编译器的一个线索,让您知道什么时候搞砸了。当消息发送到数组以获取值时,这并不意味着什么(在本例中)。