【问题标题】:When I change from instance to class method, why is 'self' no longer allowed?当我从实例更改为类方法时,为什么不再允许“自我”?
【发布时间】:2013-07-08 15:49:25
【问题描述】:

恐怕这是一个愚蠢的问题,但我真的不明白。

我有一个类,RemoteConfiguration,目前它的功能是所有实例方法。既然如此,我必须像这样使用它:

RemoteConfiguration* configs = [[RemoteConfiguration alloc] init];
[configs updateSettings];
[configs release];

这很烦人,因为没有必要仅仅为了使用一种方法而创建一个对象,该方法可能是一个类方法并被称为:

[RemoteConfiguration updateSettings];

但是当我将方法从- 更改为+ 时,Xcode 抱怨我使用self 访问的每个对象,建议我改用->。 (这也会导致警告) 我不明白这个。不管方法是什么,对象仍然有它的成员变量。那么为什么-> 是必要的呢?以及如何在类方法中使用成员变量?

【问题讨论】:

    标签: ios objective-c class-method class-members


    【解决方案1】:

    在类方法中,关键字self 不是指该类类型的实例,而是实际的class 实例,就像[RemoteConfiguration class] 的结果一样。

    像这样的类实例没有实例变量(至少不是您声明的那些,而是Class 实例变量,最值得注意的是isa 实例变量)。

    如果您希望拥有RemoteConfiguration 的单个静态实例,您可以在.m 文件中将实例变量声明为static 变量,或使用singleton pattern 之类的东西来保持实例方便。

    【讨论】:

      【解决方案2】:

      在没有看到代码的情况下,听起来您正在从您希望成为类方法的方法中引用self

      您不能引用self,因为您正在对类执行操作,而不是对类的实例。因此self 不是指期望的内容。

      如果你真的想把它当作一个类方法,你就必须修改它。请记住,您只能使用局部变量和static 变量。如果您有任何属性或实例变量,您也无权访问它们。

      【讨论】:

      • 请参阅 Benoit 的回答,因为它比我自己的要详细一些。他进入了单例模式,这肯定会有所帮助
      【解决方案3】:

      “self”指向实例。类方法没有任何关联的实例。

      基本上,如果您调用一个类方法,“仍然有其成员变量”的“对象”不会被该方法“看到”,因为它是整个类上的方法,而不是特定的单个对象上的方法.

      您可能可以将一个传递给它——但是,为什么首先要使用类方法呢? (简而言之:不要。)

      理论上,也可以使用类变量而不是实例变量……这完全取决于。

      【讨论】:

      • 这是不正确的。类方法内部的self 指的是class 实例。例如,[[self alloc] init] 是类方法中的有效代码。
      • 我认为 alloc 在这里有些特殊,因为它需要类。另一方面,他的例子是指instance变量。
      • @mirabilos +alloc 绝对没有什么特别之处。类方法有一个self,而self 指的是Benoit 所说的类。
      • 是的,但这正是我要说的:类方法的“自我”与实例方法的“自我”不同,实例方法是对象,而不是类本身。我承认对 alloc 有点困惑,是的,它并不特别。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-26
      • 2014-03-01
      • 2018-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多