我正在通过fpr Objective-C进行一些演练,然后我到了很多地方,我抬起了眉毛。我很想让他们失望。
消息发送和方法调用有根本区别吗? Objective-C允许我同时执行这两项操作:object.message
产生与[object message]
相同的结果。我想可能无法使用点运算符策略创建嵌套消息?
我创建了一个NSArray
对象,现在我要使用NSEnumerator
打印结果:
id myObject = [object objectEnumerator];
在while循环中迭代并打印结果。 myObject
的类型是id
,这意味着它在运行时解析而不是编译时。我非常清楚地知道我的NSArray
中存储了哪些对象 - 它们是NSString
s-so,方法是将myObject
的类型更改为
NSString * myObject
,它运作得很好。但是,我进行了实验,发现myObject
可以是任何类型,无论是NSString
还是NSArray
还是NSEnumerator
,其中任何一种都可以正常工作,完美地迭代NSArray
对象并产生相同的结果。
怎么了?
答案 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)
邮件发送是执行此操作的首选方式。它是社区使用并强化对象发送消息的概念,当你开始使用选择器并询问对象是否响应选择器(消息)时,它会在后面发挥作用。
id
基本上是指向任何东西的指针。它需要一些习惯,但它是Objective-C处理对象动态类型的基础。当NSLog()
遇到%@
格式说明符时,它会向应该替换令牌的对象发送description
消息(这是在超类NSObject
中实现的,可以是在子类中重写以获得所需的输出。)
将来当你这样做时,你可能会发现做这样的事情更容易:
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);
你最终会学会喜欢发送消息。