當我正在學習類別。它說新方法被添加到類的所有實例。即使類方法也有同樣的權利?我們有適用於所有實例的類方法。那麼何時使用類別以及何時使用類方法呢?類別和類方法有什麼區別?
回答
類別和類方法是完全不同的東西。你讀的一句話,你完全誤解了。類方法不會被添加到的任何類的實例中。實例方法被添加到類的實例中,類方法被添加到類本身。
一個類別進一步增加了實例方法不屬於類定義本身中可用。 Objective-C中的好處在於,即使類本身不適用於您,也可以使用其他實例方法添加類別。
這個答案大部分是相當誤導,如果沒有錯的話。類別也可以有類方法,而不僅僅是實例方法。而在第一段中,方法不會被「添加到實例」中。實例方法作用於類的一個實例。類方法不使用類的實例。 – rmaddy
好吧,讓我們來看一個例子。假設你使用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];
- 1. Debug類和Trace類有什麼區別?
- 2. ConfigurationManager類和Settings類有什麼區別?
- 3. HostingEnvironment類和HttpRuntime類有什麼區別?
- 4. 子類和子類有什麼區別?
- 5. java.awt.Rectangle類和java.awt.geom.Rectangle2D.Double類有什麼區別?
- 6. 有什麼區別?和T在類和方法簽名?
- 7. 繼承與類別有什麼區別
- 8. 算法和方法有什麼區別
- 9. 在Ruby中,類方法和類的單例方法有什麼區別?
- 10. Syncano類和SyncanoDashboard有什麼區別?
- 11. gRPC和Beta gRPC類有什麼區別?
- 12. 抽象類和Mixin有什麼區別?
- 13. Helper和Utility類有什麼區別?
- 14. 聚類和匹配有什麼區別?
- 15. CommaIO和Comma7IO類有什麼區別?
- 16. super()和Parent類名有什麼區別?
- 17. POI HSSFCell類的getRichStringCellValue()和getStringCellValue()方法有什麼區別?
- 18. mro方法和類的__mro__屬性有什麼區別?
- 19. Spring Batch JobExecution類的getAllFailureExceptions()和getFailureExceptions()方法有什麼區別?
- 20. LinkedList類中的element()和getFirst()方法有什麼區別?
- 21. 通過 - >和via ::?訪問類方法有什麼區別?
- 22. 'remove'和'removeChild'方法有什麼區別?
- 23. Html.Partial和Html.Action方法有什麼區別?
- 24. browser.sleep()和browser.wait()方法有什麼區別?
- 25. 方法`toHaveBeenCalled()`和`andCalledThrough()`有什麼區別?
- 26. 'configure'和'configureGlobal'方法有什麼區別?
- 27. bcrypt()和crypt()方法有什麼區別?
- 28. GET和POST方法有什麼區別?
- 29. UrlHelper.Route和UrlHelper.Link方法有什麼區別?
- 30. nibNameOrNil和ViewDidLoad方法有什麼區別?
沒有這樣的事情在Objective-C爲靜態方法。你究竟是什麼意思? – rmaddy
@rmaddy ...我的意思是說類方法。我會更新這個問題。 – user4150758
方法範圍(類與實例......我不確定「範圍」是否是適當的形容詞)與類別中定義的方法無關(我相信它也可以是類或對象)。類別只是一種提供原本不存在的附加方法的方法。真的,它們只是一種方便,可以避免編寫完成相同任務的獨立功能。 – mah