【问题标题】:Difference between class methods and instance methods?类方法和实例方法的区别?
【发布时间】:2010-12-07 10:09:24
【问题描述】:

当我在编程中使用实例方法和类方法时,我总是感到困惑。请告诉我实例方法和类方法之间的区别以及彼此的优点。

【问题讨论】:

  • 你真的在谈论 C++ 吗?我们不使用术语“实例方法”和“类方法”;我们使用术语“(非静态)成员函数”和“静态成员函数”。
  • 现在谈objective-c???
  • @Karl Knechtel,谢谢。您的评论有助于解释 C++ 和 Objective-C 的区别。
  • @RRB对实例方法和类方法有明确的解释stackoverflow.com/questions/1053592/…

标签: objective-c


【解决方案1】:

所有其他答案似乎都被现在已修复的不正确标签发现了。

在 Objective-C 中,实例方法是在向类的实例发送消息时调用的方法。所以,例如:

id foo = [[MyClass alloc] init];
[foo someMethod];
//   ^^^^^^^^^^   This message invokes an instance method.

在 Objective-C 中,类本身就是对象,类方法只是在向类对象发送消息时调用的方法。即

[MyClass someMethod];
//       ^^^^^^^^^^   This message invokes a class method.

请注意,在上面的示例中,选择器是相同的,但是因为在一种情况下它被发送到 MyClass 的一个实例,而在另一种情况下它被发送到 MyClass,因此调用了不同的方法。在接口声明中,您可能会看到:

@interface MyClass : NSObject
{
}

+(id) someMethod;  // declaration of class method
-(id) someMethod;  // declaration of instance method

@end

在实现中

@implementation MyClass

+(id) someMethod
{
    // Here self is the class object
}
-(id) someMethod
{
    // here self is an instance of the class
}

@end

编辑

抱歉,错过了第二部分。没有这样的优点或缺点。这就像问 while 和 if 之间有什么区别,以及一个比另一个有什么优势。这有点毫无意义,因为它们是为不同的目的而设计的。

类方法最常见的用途是在需要时获取实例。 +alloc 是一个类方法,它为您提供一个新的未初始化实例。 NSString 有很多类方法来给你新的字符串,例如+stringWithForma

另一个常见的用途是获取单例,例如

+(MyClass*) myUniqueObject
{
    static MyUniqueObject* theObject = nil;
    if (theObject == nil)
    {
        theObject  = [[MyClass alloc] init];
    }
    return theObject;
}

上述方法也可以用作实例方法,因为 theObject 是静态的。但是,如果将其设为类方法并且不必先创建实例,则语义会更清晰。

【讨论】:

    【解决方案2】:

    如果我们不想创建 class 的对象,那么我们使用 class 方法 如果我们想通过类的对象调用方法,那么我们使用实例方法

    【讨论】:

      【解决方案3】:

      我不知道我们是否可以谈论任何优势,这取决于您正在实施什么。

      实例方法应用于类的实例,因此它们需要一个对象来应用并且可以访问其调用者的成员:

      Foo bar;
      bar.instanceMethod();
      

      另一方面,类方法适用于整个类,它们不依赖于任何对象:

      Foo::classMethod();
      

      【讨论】:

        【解决方案4】:

        静态成员函数被非正式地称为类方法(不正确)。在 C++ 中没有方法,只有成员函数。

        【讨论】:

          【解决方案5】:

          【讨论】:

            【解决方案6】:

            类方法与类一起使用,但实例方法与该类的对象(即实例)一起使用

            //Class method example
            className *objectName = [[className alloc]init]; 
            [objectName methodName];
            
            //Instance method example
            [className methodName];
            

            【讨论】:

              【解决方案7】:

              实例方法使用类的实例,而类方法可以仅与类名一起使用。 + 号用在 Class Method 之前,而作为单个 desh (-) 用在实例变量之前。

              @interface MyClass : NSObject
              
              + (void)aClassMethod;
              - (void)anInstanceMethod;
              
              @end
              

              它们也可以这样使用,

              [MyClass aClassMethod];
              
              MyClass *object = [[MyClass alloc] init];
              [object anInstanceMethod];
              

              或者另一个例子是:

              [

              NSString string]; //class method
              
              NSString *mystring = [NSString alloc]init];
              [mystring changeText]; //instance Method
              

              【讨论】:

                【解决方案8】:

                就像大多数其他答案所说的那样,实例方法使用类的实例,而类方法可以仅与类名一起使用。在 Objective-C 中,它们是这样定义的:

                @interface MyClass : NSObject
                
                + (void)aClassMethod;
                - (void)anInstanceMethod;
                
                @end
                

                然后可以像这样使用它们:

                // class methods must be called on the class itself
                [MyClass aClassMethod];
                
                // instance method require an instance of the class
                MyClass *object = [[MyClass alloc] init];
                [object anInstanceMethod];
                

                类方法的一些真实世界示例是许多 Foundation 类中的便捷方法,例如 NSString+stringWithFormat:NSArray+arrayWithArray:。实例方法是NSArray-count 方法。

                【讨论】:

                  猜你喜欢
                  • 2013-06-12
                  • 2015-04-17
                  • 2010-11-06
                  • 2012-08-06
                  • 2012-08-13
                  • 2015-12-11
                  • 1970-01-01
                  • 2015-04-18
                  相关资源
                  最近更新 更多