【问题标题】:Use of asterisk in variable names在变量名中使用星号
【发布时间】:2011-03-03 01:25:38
【问题描述】:

《iPhone Programming. The Big Nerd Ranch Guide》一书引用了以下方法(第 96 页)

(void)mapView:(MKMapView *)mv didAddAnnotationViews:(NSArray *) views {
    MKAnnotationView *annotationView = [views objectAtIndex:0];
    id <MKAnnotation> mp = [annotationView annotation];
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance([mp coordinate], 250, 250);
    [mv setRegion:region animated:YES];
}

我对星号的使用感到困惑。以“MKAnnotationView”开头的行和下面的行可以抽象的表示为:

ObjectType variableName = [object message];

问题:

  1. 在第一种情况下,星号在变量名之前,但在第二种情况下没有。为什么?
  2. 在使用星号的情况下,不应该是分配给nil的指针吗?

谢谢。

【问题讨论】:

    标签: iphone objective-c


    【解决方案1】:

    我倾向于将其视为哪些变量类型需要星号,而不是哪些变量名需要星号。 Objective C 不允许你像这样在栈上分配对象:

    // Declare an NSObject. Won't work.
    NSObject myObject;
    

    相反,所有对象都必须使用如下指针在堆上动态分配:

    // Declare a pointer to an NSObject. Will work.
    NSObject* myObject = [[NSObject alloc] init];
    

    id 是一个特殊的 Objective C 关键字,仅表示“指向某个 Objective C 对象的指针”。这可能会或可能不会从 NSObject 继承,并且是动态类型的。需要注意的重要一点是,虽然没有星号,但这仍然是一个指向对象的指针:

    // Same as before. Will work.
    id myObject = [[NSObject alloc] init];
    

    唯一的区别是编译器没有关于myObject是什么的信息。

    最后,id &lt;MKAnnotation&gt; 与常规的id 完全相同,但为编译器提供了一些额外信息。将其读作“指向某个行为类似于 MKAnnotation 的 Objective C 对象的指针”。在这种情况下,MKAnnotation 是一个协议的名称,您要声明该特定 id 来实现其所需的方法。

    【讨论】:

      【解决方案2】:

      id 已经定义为指向结构的指针。如果您在objc.h 中查看它的定义,您会发现id 被定义为,

      typedef struct objc_object {
          Class isa;
      } *id;
      

      由于它已经是指向objc_object 的指针,因此您可以创建指向对象的指针,而无需使用星号作为,

      id myObject;
      

      还说对象是id 类型,编译器绝对不会提供关于该对象的任何信息,除了来自isa 属性的类。

      另一方面,NSObject 定义为,

      @interface NSObject <NSObject> {
          Class   isa;
      }
      

      要创建指向NSObject 或其子类之一(例如MKAnnotationView)的对象的指针,您可以将其声明为,

      NSObject *myObject;
      MKAnnotationView *myObject;
      

      我们将星号放在这里表示它是一个指针。

      在类型旁边指定协议可为编译器提供更多静态类型检查信息。

      您应该查看此article,以简要介绍idNSObject 之间的区别。如需深入了解,请在 Objective-C 运行时查看此article

      【讨论】:

        【解决方案3】:

        ObjectType 通常类似于“指向 MKAnnotationView 的指针”,它在 Objective-C 中表示,就像在 C 中一样:“MKAnnotationView *”。例外情况包括“id”类型、各种整数和浮点类型(包括它们的 typedef)、枚举(实际上是整数类型)以及一些像 CGRect 这样的小结构。

        【讨论】:

        • @Max:如果你想进入 Objective-C 的 C 级实现,当然可以。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多