2010-12-07 140 views
1

當我在編程中使用實例方法和類方法時,我總是感到困惑。請告訴我實例方法和類方法以及相互之間的優點之間的區別。類方法和實例方法之間的區別?

+0

你真的在談論C++嗎?我們不使用術語「實例方法」和「類方法」;我們使用術語「(非靜態)成員函數」和「靜態成員函數」。 – 2010-12-07 10:10:21

回答

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 

編輯

對不起,錯過了第二部分。這樣沒有優點或缺點。這就好比問什麼是時間和時間,以及相對於另一方的優點有什麼區別。這是沒有意義的,因爲它們是爲不同的目的而設計的。

類方法最常見的用途是在需要時獲取實例。 +alloc是一種爲您提供新的未初始化實例的類方法。 NSString有許多類方法可以爲你提供新的字符串,例如+ stringWithForma

另一個常見用途是獲得一個單例如

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

上述方法也可以作爲實例方法使用,因爲object是靜態的。但是,如果將其設置爲類方法並且不必首先創建實例,則語義更清晰。

0

靜態成員函數被非正式地稱爲類方法(不正確)。在C++中沒有方法,有成員函數。

1

我不知道我們是否可以談任何優勢,這是相當要實現什麼樣的問題。

實例方法適用於類的實例,因此他們需要一個對象上應用,可以訪問他們的主叫方的成員:

Foo bar; 
bar.instanceMethod(); 

在另一方面類方法適用於整個類,他們不」 t依賴於任何對象:

Foo::classMethod(); 
4

如果我們不希望創建類的對象,然後我們使用類方法 如果我們想通過一個類的對象調用該方法,然後我們使用實例方法

0

類方法與類,但實例方法使用與該類即實例

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

//Instance method example 
[className methodName]; 
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 
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]; 

的類方法的一些真實世界的例子有很多基礎類的便利方法,如NSString+stringWithFormat:NSArray+arrayWithArray:。實例方法將是NSArray-count方法。

相關問題