2010-04-22 58 views
31

在Java中,我可以有一個類,例如,Utility和我有一個名爲changeToCapitalLetter靜態方法,所以我可以做這樣的事情:如何在Objective-C中創建靜態方法?

Utility.changeToCapitalLetter(myString); 

我怎樣才能做到在Objective C中的類似的事情?

非常感謝

回答

89

在Objective-C,你稱之爲 「類方法」,見here

@interface MyClass : NSObject 

+ (void)aClassMethod; 
- (void)anInstanceMethod; 

@end 

+是最重要的事情;你調用該方法是這樣的:[MyClass aClassMethod];

+2

權,但要記住,你總是可以過正常的聲明全局C函數。 – 2010-04-22 13:58:55

15

維基百科:靜態方法既不需要 類的實例,也可以隱式地訪問數據(或本,自我,我, 等)等一個實例。

這個描述了Objective-C的類方法不是什麼。

Objective-C類方法非常需要一個實例,它是方法調用的目標。也就是說,它需要描述被調用的類對象的元類實例。與靜態方法不同,Objective-C的類方法可以被繼承(這與前面提到的自我相結合,正是爲什麼許多類可以在NSObject上共享一個單獨的,簡單的+ alloc實現,而不需要它們自己的定製實現)並且調用一個類方法通過與任何其他方法調用站點完全相同的基於objc_msgSend *的調度機制。

Objective-C的類方法可以在整個類層次結構中重寫,並且可以調整它們。在通常提供靜態方法來代替類方法的語言中,沒有一種是支持的。

儘管類方法和靜態方法在實踐中大部分時間是相同的,但它們是不同的。使用靜態方法,該類將充當命名空間限定符。隨着類方法的類本身就是一個對象,因此類的方法對類對象完全一樣的東西實例方法是一個實例,作爲結果,你可以做以下

@interface TestClass : NSObject 

    +(void)classOrInstanceMethod; 
    -(void)classOrInstanceMethod; 

    @end 

    @implementation TestClass 

    +(void)classOrInstanceMethod{ 
     NSLog(@"%s", __PRETTY_FUNCTION__); 
    } 
    -(void)classOrInstanceMethod{ 
     NSLog(@"%s", __PRETTY_FUNCTION__); 
    } 
    @end 

    int main(int argc, const char* argv[]) 
    { 
     @autoreleasepool{ 
      NSLog(@"Static method in ObjectiveC"); 
     } 

     NSArray* arr = [NSArray arrayWithObjects:[[TestClass alloc]init], 
              [TestClass class], nil]; 
     for(id obj in arr) 
      [obj classOrInstanceMethod]; 
    } 

其中classOrInstanceMethod的版本被稱爲取決於obj是類對象還是實例。如果您熟悉工廠類模式,則此模式是Objective-C語言的一部分。

底線是靜態方法和類方法是非常不同的。雖然這種差異對於日常編碼而言通常是透明的,但仍然有知道類方法如何工作的情況可以爲您節省大量不必要的代碼。

一部開拓創新的鏈接herehere

+1

這只是公平的注意,這不是一個原始的答案; [它寫在這裏。](https://stackoverflow.com/a/8089623/6645482) – 2017-07-28 15:52:20