为什么不能在id上使用点符号,当常规语法可以?

时间:2014-08-20 17:55:09

标签: objective-c syntax

MyClass.h

@interface MyClass : NSObject

@property (nonatomic) NSString *something;

@end

MyClass.m

@implementation MyClass

@end

然后我这样做:

    MyClass *instance = [[MyClass alloc] init];
    id theSame = instance;

    [theSame setSomething:@"hh"];   // No error
    theSame.something = @"hh";    // "Property 'something' not found…"

为什么第四行会出错,但不是第三行?他们做的完全一样。

1 个答案:

答案 0 :(得分:1)

围绕它存在争议,特别是在声明属性之前出现的程序员会建议不要使用dot synthax。然而,就像任何其他语言一样,Obective-C也在不断发展,我认为它的确朝着正确的方向发展。现在,要回答您的问题,您可以将dot synthax视为访问属性的一种方式。 id没有声明属性,因此尝试访问一个将导致编译时错误。另一方面,当您使用方法synthax时,将其视为向接收方发送消息,该消息在运行时进行评估。因此,在编译时将任何消息发送到id都是正确的,编译器假定您知道您正在做什么以及接收器将在运行时以某种方式处理该消息。因此,您可以充分利用这种差异:始终使用点表示法,但是当您确定接收器可以处理消息时使用方法synthax,但编译器不知道。 (这种情况在某种程度上是罕见的,但非常重要,它们可以让你利用Objective-C的动力)