【问题标题】:Call a class method from within that class从该类中调用类方法
【发布时间】:2011-09-02 23:29:33
【问题描述】:

有没有办法从同一个类中的另一个方法调用一个类方法?

例如:

+classMethodA{
}

+classMethodB{
    //I would like to call classMethodA here
}

【问题讨论】:

  • 首先我们说如何向方法发送消息?不怎么调用方法?这是 obj-c 中的一种表达方式。
  • 你试过了吗?发生了什么?
  • @Craftero 你不是说向对象发送消息吗?消息不会发送到方法。
  • 糟糕,对不起! @inspectorg 是对的!它向对象发送消息

标签: objective-c class-method


【解决方案1】:

在类方法中,self 指的是正在发送消息的类。因此,在另一个类方法(比如 classMethodB)中,使用:

+ (void)classMethodB
{
    // ...
    [self classMethodA];
    // ...
}

在实例方法(比如 instanceMethodB)中,使用:

- (void)instanceMethodB
{
    // ...
    [[self class] classMethodA];
    // ...
}

请注意,两者都不会假定您正在发送消息的是哪个类。实际的类可能是子类。

【讨论】:

  • 你改变了你的术语。 [self foo] 用于实例方法,[MyClass bar] 用于类方法。
  • 不。 self 的含义取决于您发送的信息。如果您向班级发送消息,self 就是班级。如果您向一个实例发送消息,self 就是该实例。我在 qualitycoding.org/factory-method 中解释了消息传递 self 对于类方法的重要性
  • 同意,您在评论中所说的是真实的,但您的答案中的术语实际上是倒退的。在实例方法中使用[self class] 没有多大意义,但在类方法中完全有意义。请记住,实例方法以- 开头,类方法以+ 开头,使用self 引用对象的实例具有语法意义,但使用[self class] 引用对象的实例没有意义在句法上。 [self class] 暗示对描述类的对象的引用,而不是类的实例。
  • @inspectorg,我想我不理解你。我们的上下文是一个问题,如何调用一个类方法。如果要从实例方法调用类方法(我的第二个示例),我首先调用[self class] 来获取对象的实际类,它可能是也可能不是MyClass
  • 我明白您现在在说什么,但您的回答措辞不清楚,因此您可能需要对其进行编辑。你说的是例如inside classMethodB of MyClass 你要调用classMethodA of MyClass,你用[self classMethodA];但是,inside instanceMethodB of MyClass 你想调用classMethodA of MyClass,你使用[[self class] classMethodA]。这是对的!你的措辞和简单的例子表明应该使用self 调用类方法和[self class] 调用实例方法,后者是错误的(我以为你在说什么)。
【解决方案2】:

应该很简单:

[MyClass classMethodA];

如果这不起作用,请确保您在类的接口中定义了方法签名。 (通常在 .h 文件中)

【讨论】:

  • 这是一种方法;但是,这不会尊重子分类。在大多数情况下,使用 [self classMethodA] 可能更明智。正如我在类方法中所理解的那样,“self”将是类对象(因为类方法是类的实例方法)。所以会调用 MyClass 的方法,但不会调用 MyClassSubclass 的 classMethodA
  • 还要注意他在问题中说的是“同班同学”
【解决方案3】:

在目标 C 中,'self' 用于调用同一类中的其他方法。

所以你只需要写

+classMethodB{
    [self classMethodA];
}

【讨论】:

  • self 仅适用于实例方法,但问题表明他正在谈论类方法(方法名称前带有+ 符号)
【解决方案4】:

当然。

假设你定义了这些方法:

@interface MDPerson : NSObject {
    NSString *firstName;
    NSString *lastName;

}

+ (id)person;
+ (id)personWithFirstName:(NSString *)aFirst lastName:(NSString *)aLast;
- (id)initWithFirstName:(NSString *)aFirst lastName:(NSString *)aLast;


@property (copy) NSString *firstName;
@property (copy) NSString *lastName;

@end

前2个类方法可以实现如下:

+ (id)person {
   return [[self class] personWithFirstName:@"John" lastName:@"Doe"];
}

+ (id)personWithFirstName:(NSString *)aFirst lastName:(NSString *)aLast {
    return [[[[self class] alloc] initWithFirstName:aFirst lastName:aLast]
                                                      autorelease];
}

【讨论】:

    猜你喜欢
    • 2013-10-01
    • 1970-01-01
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    相关资源
    最近更新 更多