UIButton 是一個類簇麼?

叫什麼都不如叫Pluto-Y發表於2016-09-22

類簇(Class Clusters)用通俗一點講就是一個public的抽象類加上一些private的私有類構成的,它是對一些實現細節進行隱藏,而對外公開的行為進行統一的一種設計。相信大家在平常工作中多少有注意到一些蛛絲馬跡。例如我們常用的NSNumber, NSArray, NSDictionary以及NSString等,而這些都是總所周知。

然而就UIButton是不是類簇,本王就糾結了。To be or not to be, that’s a question. 這時候就應該裝逼了,搬出莎士比亞這句話。 順帶就帶著這個來說說類簇的問題。關於為什麼糾結呢?因為很多地方包括書籍都提到UIButton是類簇,而我再Stack Overflow卻找到這樣一段話:

UIButton is not a class cluster at all. A class cluster is represented by a public abstract class, that means no instance variables, with a bunch of private concrete subclasses that provide the implementation of the abstract methods of the abstract class. UIButton on the other hand is a concrete class, none of its methods is abstract, and it has instance variables to store the value you pass through its arguments. The only problematic part is that +buttonWithType can instantiate subclasses instead of UIButton directly, thus it can be seen as a factory method, not a class-cluster…

然後我就懵逼了,根據類簇大體的概念我們知道至少說如果UIButton是一個抽象類的話,那麼應該還存在一些private的私有類來實現具體的細節。

那麼我們的任務就是就是找到這些私有類,之前看了@我就叫Sunny怎麼了 的一篇文章從NSArray看類簇後發現至少UIButton中沒辦法用這種方法,於是就想說用LLDB斷點一下,用了下面這條命令:

得到了這樣一段彙編:

看到這裡小夥伴不要害怕,吃口粑粑冷靜一下。我不是要大家看每一句話是什麼意思,大家可以注意一下每一行最後又Button關鍵字的地方,會發現一堆我們平時沒見過的一些Button,如UIPopoverButton, UIRoundedRectButton, UINavigationButton, UITexturedButton, _UIPlacardButton以及_UIShortPlacardButton等。至少我們發現了我們所說的private的私有類,那麼我們就可以知道其實這裡的UIButton是一個類簇。

那麼我們也用官網的圖來說說類簇的用處:

NSNumber

可以從上圖看到雖然官方的實現細節根據不同的型別有不同的實現,但是我們所需要記得以及互動的介面都可以通過NSNumer來進行互動。而如果我們自己在設計類簇的時候也可能通過這種方式來進行隱藏一些細節的實現。

但是在設計自己的類簇的過程中需要注意一下幾點:

  • 首先要定義好抽象基類
  • 其次需要指明子類需要重寫的方法
  • 最後提供一個比較好的文件說明方面其他人讀寫

最後就到這吧,小夥伴各回各家,各找各媽吧~

PS:具體程式碼可以從Github上獲取。

如有問題或糾正, 可以聯絡@叫什麼都不如叫Pluto-Y或在Github

打賞支援我寫出更多好文章,謝謝!

打賞作者

打賞支援我寫出更多好文章,謝謝!

任選一種支付方式

UIButton 是一個類簇麼? UIButton 是一個類簇麼?

相關文章