类方法和实例方法的区别?

时间:2010-12-07 10:09:24

标签: objective-c

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

8 个答案:

答案 0 :(得分:11)

所有其他答案似乎都被现已修复的错误标记所捕获。

在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;
}

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

答案 1 :(得分:4)

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

答案 2 :(得分:1)

我不知道我们是否可以谈论任何优势,这只是你正在实施的问题。

实例方法适用于类的实例,因此需要应用对象并可以访问其调用者的成员:

Foo bar;
bar.instanceMethod();

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

Foo::classMethod();

答案 3 :(得分:0)

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

答案 4 :(得分:0)

答案 5 :(得分:0)

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

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

//Instance method example
[className methodName];

答案 6 :(得分:0)

实例方法使用类的实例,而类方法只能使用类名。在类方法之前使用+符号,其中在实例变量之前使用单个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

答案 7 :(得分:0)

与大多数其他答案一样,实例方法使用类的实例,而类方法只能使用类名。在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的{​​{1}}或+stringWithFormat:的{​​{1}}。实例方法是NSArray的{​​{1}}方法。