當我在編程中使用實例方法和類方法時,我總是感到困惑。請告訴我實例方法和類方法以及相互之間的優點之間的區別。類方法和實例方法之間的區別?
回答
所有其他答案似乎已被錯誤的標記已被捕獲,現在已被修復。
在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是靜態的。但是,如果將其設置爲類方法並且不必首先創建實例,則語義更清晰。
靜態成員函數被非正式地稱爲類方法(不正確)。在C++中沒有方法,有成員函數。
我不知道我們是否可以談任何優勢,這是相當要實現什麼樣的問題。
實例方法適用於類的實例,因此他們需要一個對象上應用,可以訪問他們的主叫方的成員:
Foo bar;
bar.instanceMethod();
在另一方面類方法適用於整個類,他們不」 t依賴於任何對象:
Foo::classMethod();
如果我們不希望創建類的對象,然後我們使用類方法 如果我們想通過一個類的對象調用該方法,然後我們使用實例方法
類方法與類,但實例方法使用與該類即實例
//Class method example
className *objectName = [[className alloc]init];
[objectName methodName];
//Instance method example
[className methodName];
實例方法使用一個類的實例的對象所使用的,而類方法可以只用類名被使用。在類方法之前使用+符號,其中在實例變量之前使用單個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
像大多數其他的答案都表示,實例方法使用一個類的實例,而類方法只能與類名一起使用。在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
方法。
- 1. 跟進:類方法和實例方法之間的區別?
- 2. 內部類方法與Java中的實例方法之間的區別
- 3. 單例方法之間的區別
- 4. getter方法和返回實例變量狀態的方法之間的區別?
- 5. C#:方法類型之間的區別
- 6. 事件和方法之間的區別
- 7. getRootNav()和navCtrl()方法之間的區別
- 8. 「__method__」和「方法」之間的區別
- 9. PrintWriter.printf和PrintWriter.format方法之間的區別
- 10. EventLog.WriteEntry和EventLog.WriteEvent方法之間的區別
- 11. doGet和doHead方法之間的區別
- 12. Map.put和Map.putAll方法之間的區別?
- 13. GET和POST方法之間的區別?
- 14. $ http.get和方法之間的區別:'GET'
- 15. 下劃線js之間的區別_each方法和_.invoke方法
- 16. UdpClient.Send方法和UdpClient.Client.Send方法之間的區別
- 17. 對類方法的調用和對實例方法的調用之間有什麼區別?
- 18. Objective-C中的實例方法和類方法有什麼區別?
- 19. java.io.DataOutputStream類中的writeChar方法和writeShort方法之間有什麼區別?
- 20. 如何告訴Ruby類和實例方法的區別
- 21. AlarmManager類的set和setRepeat方法之間的區別?
- 22. DOM和文檔類的getElementById方法之間的區別
- 23. CharSequence接口和對象類的toString()方法之間的區別
- 24. JAVA中的類和方法之間的區別
- 25. 類方法和實例方法
- 26. 雙緩衝方法之間的區別
- 27. HTTP方法之間的區別
- 28. Laravel之間的區別路由方法
- 29. Javascript包裝方法之間的區別
- 30. 旋轉方法之間的區別?
你真的在談論C++嗎?我們不使用術語「實例方法」和「類方法」;我們使用術語「(非靜態)成員函數」和「靜態成員函數」。 – 2010-12-07 10:10:21