UIButton 是一个类簇么?

类簇(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

打赏支持我写出更多好文章,谢谢!

打赏作者

打赏支持我写出更多好文章,谢谢!

任选一种支付方式

1 收藏 评论

关于作者:叫什么都不如叫Pluto-Y

嗨,我叫章龙华,一名由Java EE转到iOS的程序猿。不断的修行与前进,喜欢学习新的知识,寻找志同道合之人。不断努力着,为了明天的更轻松。 个人主页 · 我的文章 · 1 ·     

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部