2015-12-15 55 views
0

當我正在學習類別。它說新方法被添加到類的所有實例。即使類方法也有同樣的權利?我們有適用於所有實例的類方法。那麼何時使用類別以及何時使用類方法呢?類別和類方法有什麼區別?

+0

沒有這樣的事情在Objective-C爲靜態方法。你究竟是什麼意思? – rmaddy

+0

@rmaddy ...我的意思是說類方法。我會更新這個問題。 – user4150758

+0

方法範圍(類與實例......我不確定「範圍」是否是適當的形容詞)與類別中定義的方法無關(我相信它也可以是類或對象)。類別只是一種提供原本不存在的附加方法的方法。真的,它們只是一種方便,可以避免編寫完成相同任務的獨立功能。 – mah

回答

-1

類別和類方法是完全不同的東西。你讀的一句話,你完全誤解了。類方法不會被添加到的任何類的實例中。實例方法被添加到類的實例中,類方法被添加到類本身。

一個類別進一步增加了實例方法不屬於類定義本身中可用。 Objective-C中的好處在於,即使類本身不適用於您,也可以使用其他實例方法添加類別。

+2

這個答案大部分是相當誤導,如果沒有錯的話。類別也可以有類方法,而不僅僅是實例方法。而在第一段中,方法不會被「添加到實例」中。實例方法作用於類的一個實例。類方法不使用類的實例。 – rmaddy

0

好吧,讓我們來看一個例子。假設你使用NSArray作爲數據的主要集合對象。所以這意味着大多數時候,你的數據都是在NSArray中傳遞的。

NSArray *myArray = @[@"obj1",@"obj2",@"obj3"]; 

同時,可以說你在你的應用程序中對你的數據集執行某些操作。在這個例子中,假設你想隨機化數組中的所有數據。你怎麼能做到這一點?

選項1(自定義子類 - 實例方法):寫了一個作爲實現對數據的常用操作使用實例方法設置一個「助手」一類。

例)MyDataHelper類

@interface MyDataHelperClass : NSObject 
{ 
-initWithData(NSArray*)array; 
-(NSArray*)randomizeData 
-(NSArray*)sortData 
... 
} 

雖然沒有什麼死一般錯這樣的事情,它似乎是,你必須要經過將得到所有被複制的地方額外的工作。你需要初始化你的助手類,然後調用實例方法來操作你的數據。

例)

// Init your helper 
MyDataHelper *helper = [[MyDataHelper alloc]] initWithData:myArray]; 
// Call your helper methods 
NSArray *randomArray = [helper sortData] 

選項2(自定義子類 - 類方法):編寫爲您的數據實現共同操作的「助手」的行爲使用類方法設置一個類。

@interface MyDataHelperClass : NSObject 
{ 

+(NSArray*)randomizeData:(NSArray*)data 
+(NSArray*)sortData:(NSArray*)data 
... 
} 

類方法是可以從類中調用而不需要實例化類的方法。大多數時候,他們被用來提供方便的操作,你可能會經常打電話等等...

例)

NSArray *randomArray = [MyDataHelper randomizeData:myArray]; 

注意的使用是如何更加簡化,但有一個更好的比這更方式嗎?

選項3 :(類別 - 實例+類方法)使用類別將實例方法或類別方法添加到現有類。

類別就像是將類和實例方法添加到任何現有類的方法。當你這樣做時,如果你導入你的類別,你將能夠從擴展類中調用你添加的方法。

在這個例子中,我們的數據集是一個NSArray。如果我們添加一個名爲DataHelper + NSArray的類,我們可以直接在NSArray對象上添加我們的helper方法。

例)

@interface NSArray (DataHelper) 

- (NSArray)sortData; 
- (NSArray)randomizeData; 

@end 

@implementation NSArray (DataHelper) 
- (NSArray)sortData 
{ 
...// Calling self, is the NSArray instance (myArray) 
} 
- (NSArray)randomizeData 
{ 
...// calling self, is the NSArray instance (myArray) 
} 

@end 

注意使用現在如何更有道理。

例)

NSArray *sortedData = [myArray sortData]; 
相關問題