【问题标题】:dot notation and accessing instance variable点表示法和访问实例变量
【发布时间】:2011-09-22 15:01:53
【问题描述】:

所以我正在阅读其他一些关于使用点符号访问实例变量的帖子,其定义如下:

通过 self.myVariable,您正在访问实例变量 myVariable 通过 myVariable 您正在访问局部变量。他们不是 同样的事情。

这对我来说似乎很困惑,尤其是来自 java 背景。有人可以在这里清楚地向我解释他所说的局部变量是什么意思吗?这和在java中使用它是一样的吗?如果它是相同的,那么在java中如果说你有:

private int myVariable;

int testFunction(int m)
{
  myVariable = 3;
}

这将访问 myVariable 实例变量,因为该方法中没有定义局部变量。

【问题讨论】:

    标签: iphone objective-c ipad


    【解决方案1】:

    Self.myVariable 不访问实例变量(大多数情况下不会有区别,但有例外情况,例如您有自定义设置器时)。相反,它访问属性的 getter。相当于:

    [self myVariable];
    

    如果你想直接访问一个实例变量,你可以使用:

    myVariable;
    

    如果你想访问另一个对象的实例变量,你可以这样做:

    otherObject->myVariable;
    

    虽然正如 Caleb 在下面的 cmets 中所说的那样,但这是不受欢迎的。

    【讨论】:

    • 所以你说的是这个问题的最后一个答案,没有。 2错了? stackoverflow.com/questions/6113755/…
    • +1 表示 ivar 和 property 之间的区别。但是,在 Objective-C 中,使用 -> 访问其他对象的 ivars 通常是不好的形式。在别人的 ivars 中闲逛可不是什么好事。
    • 在 Objective-C 中,如果我不使用 self.instanceVariable 而只是执行 instanceVariable = 3;这实际上会做什么?它没有访问设置器,那么它在做什么?我想这是我的困惑
    • self.instanceVariable = 3 正在访问setter。因此,如果该属性用于一个对象,并且当您执行 self.instanceVariable = someObject; 时它是一个保留属性,它将保留新值并释放旧值。如果您只是访问具有保留属性的 ivar,直接(使用 ->)新值不会被保留,旧值不会被释放,导致旧值被泄露,新值不会被保留,可能被过早释放。通常在获取值时直接访问它是可以的,如果您有自定义 getter,则例外。
    • @adit 第 2 点并没有完全错误,对于那个问题,原则是正确的,但从技术上讲它是错误的。我已经编辑了这一点(希望)更清楚。
    【解决方案2】:

    据我所知,点符号只是访问事物的新方式。之前它会是 [self myVariable],现在你可以做 self.myVariable。目标 c 和 java 之间的主要区别(至少对于这个问题)是在这个调用中如何传递值或对象

    OBJECTIVE C (look at the messaging section)

    JAVA

    “通过 self.myVariable 访问实例变量 myVariable,通过 myVariable 访问局部变量。它们不是一回事。” 这是有道理的,尽管我认为它的措辞很奇怪 这就是他们所说的

    self.myVariable - 类的实例变量(恰好是 self)

    myVariable - 局部变量

    foo.myVariable - foo 类的实例变量

    also remember "local" is the same as scope
    so 
    int x; //local variable to the class with a scope of the whole class
    
    method foo{
    int x; //local variable to the method with a scope of the method
    }
    

    【讨论】:

      【解决方案3】:

      嗯……我不太确定定义在说什么,但是局部变量绝对是在方法内部定义的变量。如果您是具有实例变量的类正在访问实例变量,那么您应该直接通过实例变量名称直接调用它。但是,如果在方法中定义了一个局部变量,那么它将获取局部变量而不是您的实例变量。

      例如

      
      @interface Class : NSObject
      {
          int instanceVariable;
      }
      
      @end
      
      @implementation Class
      
      -(id)init
      {
          if (self = [super init])
          {
              //You can access your instance variable like this
              instanceVariable = 1;
          }
      }
      
      @end
      

      顺便说一句,要使用点语法,您必须实现访问器方法或使用@property 和@synthesize。

      
      @interface Class : NSObject
      {
          int instanceVariable;
      }
      @property int instanceVariable;
      @end
      
      @implementation Class
      @synthesize instanceVariable;
      
      -(id)init
      {
      …
      }
      @end
      

      【讨论】:

      • 如果您不定义属性并合成,或者只说属性而不合成会发生什么?编译错误?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-22
      • 1970-01-01
      相关资源
      最近更新 更多